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
}
변경 사항은 다음과 같습니다.
- 사용하다
local
하는 것을 read
사용하다$2 $3 ...
는 사할수있제동어다니합작을록도용다▁to제▁use니어합,를 사용하면 됩니다.-n
그리고.-t
- 한다면
read
성공적으로 종료하지 못했습니다.echo
을 위한 - 나의
Git on Windows
가 있을 뿐인bash-3.1
그리고 없습니다.true
또는false
그래서 사용합니다.return
bash-4.의 현재 됩니다.물론 이것은 bash-4.4(현재 Git for Windows에 있는 것)와도 호환됩니다. - IPython 스타일("y/[n]")을 사용하여 "n"이 기본값임을 명확히 나타냅니다.
에서는 두 개 의 대소문자를 할 수 .y
또는Y
,n
또는N
선택적: 승인 질문이 제공될 때까지 질문을 반복합니다.
선택적으로:다른 답변 무시
선택적: 원하는 경우 터미널을 종료합니다.
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
&nb? Y/n &
Y? Y/nnsijf
$
이제 $i read의 첫 번째 문자만 확인합니다.
아래 코드는 두 가지를 결합한 것입니다.
대소문자를 구분하지 않고 처리할 수 있는 샵-스노케이스 매치
두 입력을 모두 수락하는 조건이면 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
'programing' 카테고리의 다른 글
SQL Azure 테이블 크기 (0) | 2023.05.02 |
---|---|
보관 파일을 제출할 때 Xcode 6이 충돌합니다. (0) | 2023.05.02 |
Azure 응용 프로그램 설정이 내 appsettings.json 파일 값을 재정의하지 않음 (0) | 2023.05.02 |
Python 3용 이미지 라이브러리 (0) | 2023.05.02 |
약속과 관찰 가능한 것의 차이점은 무엇입니까? (0) | 2023.05.02 |