
저는 어떤 일을 위해 아주 임시적인 설치 스크립트를 작성하고 있습니다. 제어 구성은 많지 않으며 기본적으로 명령 목록만 있습니다. 각 명령을 실행하기 전에 사용자가 확인하고 싶습니다. 모든 명령에 쉘 함수 이름을 붙이지 않고 bash에서 그렇게 할 수 있는 방법이 있나요?
답변1
다음을 사용할 수 있습니다 extdebug
.
shopt -s extdebug
trap '
IFS= read -rn1 -d '' -p "run \"$BASH_COMMAND\"? " answer <> /dev/tty 1>&0
echo > /dev/tty
[[ $answer = [yY] ]]' DEBUG
cmd1
cmd2
...
참고로 zsh
이에 상응하는 내용은 다음과 같습니다.
TRAPDEBUG() {
read -q "?run \"$ZSH_DEBUG_CMD\"? " || setopt errexit
echo > /dev/tty
}
cmd1
cmd2
...
더 휴대하기 좋게:
run() {
printf '%s ' "run $@?" > /dev/tty
IFS= read -r answer < /dev/tty
case $answer in
[yY]*) "$@";;
esac
}
run cmd1
run cmd2
run cmd3 > file
에서는 이라고 말해도 잘 run cmd3 > file
립니다 . 따라서 다음과 같이 작성하고 싶을 수도 있습니다.file
n
run eval 'cmd3 > file'
eval
또는 다음과 같이 함수 로 이동합니다 run
.
run() {
printf '%s ' "run $@?" > /dev/tty
IFS= read -r answer < /dev/tty
case $answer in
[yY]*) eval "$@";;
esac
}
run cmd1
run 'cmd2 "$var"'
run 'cmd3 > file'
또 다른 휴대용 제품이지만 더 많은 제한 사항이 있습니다.
xargs -pL1 env << 'EOF'
cmd1 "some arg"
cmd2 'other arg' arg\ 2
ENV_VAR=value cmd3
EOF
명령(에 있는 명령 $PATH
)에 대해서만 작동하며 인수는 리터럴 문자열(변수나 쉘 구조는 없지만 xargs는 자체 인용 형식을 이해하지만)만 가능하며 리디렉션, 파이프 등을 가질 수 없습니다.