저는 무언가를 위해 매우 임시적인 설치 스크립트를 작성하고 있습니다. 제어 구조는 많지 않으며 기본적으로 명령 목록만 있습니다. 사용자가 각 명령을 실행하기 전에 확인하기를 원합니다. 각 명령에 쉘 함수 이름을 붙이지 않고 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는 자체 인용 형식을 이해하지만)만 가능하며 리디렉션, 파이프가 있을 수 없습니다.