각 명령은 확인 메시지를 표시합니다.

각 명령은 확인 메시지를 표시합니다.

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

관련 정보