programing

Bash에서 명령이나 별칭에 "Y/n이 확실합니까?"를 추가하는 방법은 무엇입니까?

starjava 2023. 5. 2. 22:15
반응형

Bash에서 명령이나 별칭에 "Y/n이 확실합니까?"를 추가하는 방법은 무엇입니까?

이 경우, Bash에서 다음에 대한 확인을 추가하고 싶습니다.

확실합니까?[Y/n]

머큐리얼즈를 위하여hg push ssh://username@www.example.com//somepath/morepath실제로는 가명입니다.이를 달성하기 위해 별칭에 추가할 수 있는 표준 명령이 있습니까?

는 그는이 때문입니다.hg push그리고.hg out가 날 도 있고 가 원할 때도 있고 싶을 때도 있습니다.hgoutrepo실수로 입력할 수 있습니다.hgpushrepo(둘 다 별칭입니다.

업데이트: 다음과 같은 다른 명령이 포함된 기본 제공 명령일 수 있습니다.confirm && hg push ssh://...그거 참 좋겠군요...단지 명령을 요청할 수 있습니다.yes또는no.yes.

이것들은 해미쉬의대답의 더 작고 다재다능한 형태들입니다.대/소문자가 혼합된 문자를 처리합니다.

read -r -p "Are you sure? [y/N] " response
case "$response" in
    [yY][eE][sS]|[yY]) 
        do_something
        ;;
    *)
        do_something_else
        ;;
esac

또는 Bash >= 버전 3.2의 경우:

read -r -p "Are you sure? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]
then
    do_something
else
    do_something_else
fi

If 참 : 만$response빈 문자열입니다. 오류가 발생합니다.수정하려면 따옴표를 추가하기만 하면 됩니다."$response"– 문자열을 포함하는 변수에는 항상 큰따옴표를 사용합니다(예: 사용 선호)."$@"에 신대$@).

또는 Bash 4.x:

read -r -p "Are you sure? [y/N] " response
response=${response,,}    # tolower
if [[ "$response" =~ ^(yes|y)$ ]]
...

편집:

편집 내용에 따라 다음과 같이 생성하고 사용할 수 있습니다.confirm제 답변의 첫 번째 버전을 기반으로 한 명령입니다(다른 두 버전에서도 유사하게 작동합니다).

confirm() {
    # call with a prompt string or use a default
    read -r -p "${1:-Are you sure? [y/N]} " response
    case "$response" in
        [yY][eE][sS]|[yY]) 
            true
            ;;
        *)
            false
            ;;
    esac
}

이 기능을 사용하려면:

confirm && hg push ssh://..

또는

confirm "Would you really like to do a push?" && hg push ssh://..

여기 당신이 원하는 대략적인 토막글이 있습니다.인수를 전달하는 방법을 알아보겠습니다.

read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt == "y" || $prompt == "Y" || $prompt == "yes" || $prompt == "Yes" ]]
then
  # http://stackoverflow.com/questions/1537673/how-do-i-forward-parameters-to-other-command-in-bash-script
else
  exit 0
fi

를 하세요.yes | command name here:)

확인은 캐리지 리턴을 통해 쉽게 무시되며, 계속해서 유효한 입력을 요청하는 것이 유용하다고 생각합니다.

이것을 쉽게 할 수 있는 기능이 있습니다.Y|N이 수신되지 않으면 "invalid input"이 빨간색으로 나타나고 사용자에게 다시 메시지가 표시됩니다.

prompt_confirm() {
  while true; do
    read -r -n 1 -p "${1:-Continue?} [y/n]: " REPLY
    case $REPLY in
      [yY]) echo ; return 0 ;;
      [nN]) echo ; return 1 ;;
      *) printf " \033[31m %s \n\033[0m" "invalid input"
    esac 
  done  
}

# example usage
prompt_confirm "Overwrite File?" || exit 0

인수를 전달하여 기본 프롬프트를 변경할 수 있습니다.

이러한 'yes' 변형을 명시적으로 확인하지 않으려면 bash 정규식 연산자 '=~'을 정규식과 함께 사용할 수 있습니다.

read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt =~ [yY](es)* ]]
then
(etc...)

이는 사용자 입력이 'y'로 시작하는지 'Y'로 시작하는지 여부를 테스트하고 0 또는 그 이상의 'es'로 이어집니다.

해킹일 수 있습니다.

Unix/Bash에서 "xargs -p"는 명령을 실행하기 전에 확인 메시지를 표시하는 좋은 방법입니까?

우리는 사용할 수 있습니다.xargs작업 수행:

echo ssh://username@www.example.com//somepath/morepath | xargs -p hg push

물론, 이것은 가명으로 설정될 것입니다, 마치.hgpushrepo

예:

$ echo foo | xargs -p ls -l
ls -l foo?...y
-rw-r--r--  1 mikelee    staff  0 Nov 23 10:38 foo

$ echo foo | xargs -p ls -l
ls -l foo?...n

$

이것은 조금 짧을 수도 있지만, 개인적인 용도로는 아주 잘 작동합니다.

read -n 1 -p "Push master upstream? [Y/n] " reply; 
if [ "$reply" != "" ]; then echo; fi
if [ "$reply" = "${reply#[Nn]}" ]; then
    git push upstream master
fi

read -n 1한 글자만 읽습니다.Enter 키를 누를 필요가 없습니다.'n'이나 'N'이 아니면 'Y'로 가정합니다.Enter 키를 누르기만 하면 Y도 마찬가지입니다.

(실제 질문의 경우: bash 스크립트를 만들고 이전에 가리켰던 것 대신 해당 스크립트를 가리키도록 별칭을 변경합니다.)

다음을 /etc/bashrc 파일에 추가합니다.이 스크립트는 "확인"이라는 별칭 대신 상주 "함수"를 추가합니다.


function confirm( )
{
#alert the user what they are about to do.
echo "About to $@....";
#confirm with the user
read -r -p "Are you sure? [Y/n]" response
case "$response" in
    [yY][eE][sS]|[yY]) 
              #if yes, then execute the passed parameters
               "$@"
               ;;
    *)
              #Otherwise exit...
              echo "ciao..."
              exit
              ;;
esac
}
read -r -p "Are you sure? [Y/n]" response
  response=${response,,} # tolower
  if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
      your-action-here
  fi

입력을 누를 필요가 없습니다.

다음은 더 길지만 재사용 가능한 모듈식 접근 방식입니다.

  • 온다아를 반환합니다.0 = 네그고리고1=아니오
  • Enter 키를 누를 필요가 없습니다. 단 한 글자만 입력하면 됩니다.
  • 를 눌러 기본 선택을 수락할 수 있습니다.
  • 기본 선택을 사용하지 않도록 설정하여 선택을 강제할 수 있습니다.
  • 두 가지 모두에 적합zsh그리고.bash.

Enter 키를 누를 때 "아니오"로 기본 설정

로 고는 다음과 .N기본값을 그대로 사용하여 다음과 같이 입력합니다.

$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]?

참고로, [y/N]?자동으로 추가되었습니다.기본 "아니오"가 허용되므로 아무 것도 반향되지 않습니다.

유효한 응답이 제공될 때까지 다시 확인합니다.

$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]? X
Show dangerous command [y/N]? y
rm *

Enter 키를 누를 때 "예"로 기본 설정

로 고는 다음과 .Y자본화됨:

$ confirm_yes "Show dangerous command" && echo "rm *"
Show dangerous command [Y/n]?
rm *

위에서 방금 Enter 키를 눌러 명령이 실행되었습니다.

에 기본값 없음 - requiredy또는n

$ get_yes_keypress "Here you cannot press enter. Do you like this"
Here you cannot press enter. Do you like this [y/n]? k
Here you cannot press enter. Do you like this [y/n]?
Here you cannot press enter. Do you like this [y/n]? n
$ echo $?
1

여기서,1또는 거짓이 반환되었습니다.대자표 안함시로 하지 않음을 하십시오.[y/n]?

코드

# Read a single char from /dev/tty, prompting with "$*"
# Note: pressing enter will return a null string. Perhaps a version terminated with X and then remove it in caller?
# See https://unix.stackexchange.com/a/367880/143394 for dealing with multi-byte, etc.
function get_keypress {
  local REPLY IFS=
  >/dev/tty printf '%s' "$*"
  [[ $ZSH_VERSION ]] && read -rk1  # Use -u0 to read from STDIN
  # See https://unix.stackexchange.com/q/383197/143394 regarding '\n' -> ''
  [[ $BASH_VERSION ]] && </dev/tty read -rn1
  printf '%s' "$REPLY"
}

# Get a y/n from the user, return yes=0, no=1 enter=$2
# Prompt using $1.
# If set, return $2 on pressing enter, useful for cancel or defualting
function get_yes_keypress {
  local prompt="${1:-Are you sure} [y/n]? "
  local enter_return=$2
  local REPLY
  # [[ ! $prompt ]] && prompt="[y/n]? "
  while REPLY=$(get_keypress "$prompt"); do
    [[ $REPLY ]] && printf '\n' # $REPLY blank if user presses enter
    case "$REPLY" in
      Y|y)  return 0;;
      N|n)  return 1;;
      '')   [[ $enter_return ]] && return "$enter_return"
    esac
  done
}
    
# Credit: http://unix.stackexchange.com/a/14444/143394
# Prompt to confirm, defaulting to NO on <enter>
# Usage: confirm "Dangerous. Are you sure?" && rm *
function confirm {
  local prompt="${*:-Are you sure} [y/N]? "
  get_yes_keypress "$prompt" 1
}    

# Prompt to confirm, defaulting to YES on <enter>
function confirm_yes {
  local prompt="${*:-Are you sure} [Y/n]? "
  get_yes_keypress "$prompt" 0
}

음, 여기 제 버전이 있습니다.confirm제임스의 것에서 수정됨:

function confirm() {
  local response msg="${1:-Are you sure} (y/[n])? "; shift
  read -r $* -p "$msg" response || echo
  case "$response" in
  [yY][eE][sS]|[yY]) return 0 ;;
  *) return 1 ;;
  esac
}

변경 사항은 다음과 같습니다.

  1. 사용하다local하는 것을
  2. read사용하다$2 $3 ...는 사할수있제동어다니합작을록도용다▁to제▁use니어합,를 사용하면 됩니다.-n그리고.-t
  3. 한다면read성공적으로 종료하지 못했습니다.echo을 위한
  4. 나의Git on Windows가 있을 뿐인bash-3.1그리고 없습니다.true또는false그래서 사용합니다.returnbash-4.의 현재 됩니다.물론 이것은 bash-4.4(현재 Git for Windows에 있는 것)와도 호환됩니다.
  5. IPython 스타일("y/[n]")을 사용하여 "n"이 기본값임을 명확히 나타냅니다.

에서는 두 개 의 대소문자를 할 수 .y또는Y,n또는N

  1. 선택적: 승인 질문이 제공될 때까지 질문을 반복합니다.

  2. 선택적으로:다른 답변 무시

  3. 선택적: 원하는 경우 터미널을 종료합니다.

    confirm() {
        echo -n "Continue? y or n? "
        read REPLY
        case $REPLY in
        [Yy]) echo 'yup y' ;; # you can change what you do here for instance
        [Nn]) break ;;        # exit case statement gracefully
        # Here are a few optional options to choose between
        # Any other answer:
    
        # 1. Repeat the question
        *) confirm ;;
    
        # 2. ignore
        # *) ;;
    
        # 3. Exit terminal
        # *) exit ;;
    
        esac
        # REPLY=''
    }
    

이 점도 유의하십시오.이 함수의 마지막 줄에서 REPLOY 변수를 지웁니다. 않으면 ▁you▁otherwise이▁if당신그.echo $REPLY터미널을 열거나 닫거나 다시 설정할 때까지 계속 설정되어 있는 것을 볼 수 있습니다.

게임에 늦었지만, 저는 또 다른 변형을 만들었습니다.confirm이전 답변의 기능:

confirm ()
{
    read -r -p "$(echo $@) ? [y/N] " YESNO

    if [ "$YESNO" != "y" ]; then
        echo >&2 "Aborting"
        exit 1
    fi

    CMD="$1"
    shift

    while [ -n "$1" ]; do
        echo -en "$1\0"
        shift
    done | xargs -0 "$CMD" || exit $?
}

사용 방법:

confirm your_command

특징:

  • 프롬프트의 일부로 명령을 인쇄합니다.
  • NULL 구분 기호를 사용하여 인수를 전달합니다.
  • 명령의 종료 상태 유지

버그:

  • echo -en와 함께 작동합니다.bash하지만 당신의 껍데기 속에서 실패할지도 모릅니다.
  • 인수가 간섭하면 실패할 수 있습니다.echo또는xargs
  • 셸 스크립팅이 어렵기 때문에 수많은 다른 버그들

해라,

 #!/bin/bash
 pause ()
 {
 REPLY=Y
 while [ "$REPLY" == "Y" ] || [ "$REPLY" != "y" ]
 do
  echo -e "\t\tPress 'y' to continue\t\t\tPress 'n' to quit"
  read -n1 -s
      case "$REPLY" in
      "n")  exit                      ;;
      "N")  echo "case sensitive!!"   ;; 
      "y")  clear                     ;;
      "Y")  echo "case sensitive!!"   ;;
      * )  echo "$REPLY is Invalid Option"     ;;
 esac
 done
 }
 pause
 echo "Hi"

이것은 정확히 "예, 아니오를 요구하는" 것이 아니라 단지 해킹일 뿐입니다: 별칭.hg push ...하지 않는hgpushrepo 러나에게hgpushrepoconfirmedpush그리고 제가 모든 것을 설명할 수 있을 때, 왼쪽 뇌는 논리적인 선택을 했습니다.

같지는 않지만, 어쨌든 효과가 있는 아이디어입니다.

#!/bin/bash  
i='y'  
while [ ${i:0:1} != n ]  
do  
    # Command(s)  
    read -p " Again? Y/n " i  
    [[ ${#i} -eq 0 ]] && i='y'  
done  

력출:
N또? Y/N N또?
요? Y/n 아무거나
7시? Y/n 7
&amp;nb? Y/n &
Y? Y/nnsijf
$

이제 $i read의 첫 번째 문자만 확인합니다.

아래 코드는 두 가지를 결합한 것입니다.

  1. 대소문자를 구분하지 않고 처리할 수 있는 샵-스노케이스 매치

  2. 두 입력을 모두 수락하는 조건이면 yes, yes, yes, y를 통과합니다.

    쇼핑백 대 사건의 일치

    sed-4.2.2인 경우.$LINE =~ (yes|y)$ ]

    그 다음 0번 출구

    fi

여기 현지화된 정규식을 사용하는 제 솔루션이 있습니다.따라서 독일어에서도 "Ja"에 대한 "j"는 "Yes"로 해석됩니다.

첫 번째 인수는 질문입니다. 두 번째 인수가 yes보다 "y"이면 기본 대답이 되고 그렇지 않으면 no가 기본 대답이 됩니다.응답이 "예"이면 반환 값은 0이고, 응답이 "아니오"이면 1입니다.

function shure(){
    if [ $# -gt 1 ] && [[ "$2" =~ ^[yY]*$ ]] ; then
        arg="[Y/n]"
        reg=$(locale noexpr)
        default=(0 1)
    else
        arg="[y/N]"
        reg=$(locale yesexpr)
        default=(1 0)
    fi
    read -p "$1 ${arg}? : " answer
    [[ "$answer" =~ $reg ]] && return ${default[1]} || return ${default[0]}
}

기본적인 사용법은 다음과 같습니다.

# basic example default is no
shure "question message" && echo "answer yes" || echo "answer no"
# print "question message [y/N]? : "

# basic example default set to yes
shure "question message" y && echo "answer yes" || echo "answer no"
# print "question message [Y/n]? : "

이것이 오래된 질문이라는 것을 알지만, 이것은 누군가에게 도움이 될 수도 있습니다. 여기서는 다루지 않았습니다.

파일에서 입력을 받는 스크립트에서 rm-i를 사용하는 방법에 대해 질문을 받았습니다.스크립트에 대한 파일 입력은 일반적으로 STDIN에서 수신되므로 rm 명령에 대한 응답만 STDIN에서 수신되도록 스크립트를 변경해야 합니다.솔루션은 다음과 같습니다.

#!/bin/bash
while read -u 3 line
do
 echo -n "Remove file $line?"
 read -u 1 -n 1 key
 [[ $key = "y" ]] &&  rm "$line"
 echo
done 3<filelist

"y" 키 이외의 키(소문자만 해당)를 누르면 파일이 삭제되지 않습니다.키 뒤에 리턴을 누를 필요는 없습니다(따라서 디스플레이에 새 라인을 전송하는 에코 명령).POSIX bash "read" 명령은 -u 스위치를 지원하지 않으므로 해결 방법을 찾아야 합니다.

예 Dennis Williamson 답변에 대한 기본 기준입니다.

#!/bin/bash
confirm() {
    # call with a prompt string or use a default
    read -r -p "${1:-Are you sure?} [Y/n] " response
    case "$response" in
        @([nN])*([oO]))
            false
            ;;
        *)
            true
            ;;
    esac
}

사용자가 확실하지 않으면 가능한 한 빨리 종료하고 싶고, 코드가 읽기 쉽고 짧으면 좋겠습니다.사용자가 답변 후 Return을 누를지 여부에 따라,

Return을 누르면,

read -p "Warning: something scary: Continue (Y/N)? " reply
[ $reply != 'Y' ] && [ $reply != 'y' ] && echo 'Aborting' && exit 1
echo 'Scary thing'

또는 사용자가 Return을 누를 때까지 기다리지 않으려면,

read -n1 -p "Warning: something scary: Continue (Y/N)? " reply
echo ''
[ $reply != 'Y' ] && [ $reply != 'y' ] && echo 'Aborting' && exit 1
echo 'Scary thing'

다른 답변들은 그것에 대한 배경을 가지고 있습니다.-n1및 플래기옵에 대한 read.echo ''두 번째 변형에서는 사용자가 리턴을 누를 필요가 없기 때문에 단말기에 새로운 라인이 반향되지 않도록 후속 출력을 새 라인에 표시하는 것입니다.

언급URL : https://stackoverflow.com/questions/3231804/in-bash-how-to-add-are-you-sure-y-n-to-any-command-or-alias

반응형