CShell( csh )을 사용했는데 매개변수를 사용하는 별칭을 만들 수 있습니다. 표기법은 다음과 같았습니다.
alias junk="mv \\!* ~/.Trash"
Bash에서는 이것이 작동하지 않는 것 같습니다. Bash에 유용한 기능이 많다는 점을 감안할 때 이 기능이 구현되었다고 가정하지만 어떻게 구현되었는지 궁금합니다.
질문자 :Hello
CShell( csh )을 사용했는데 매개변수를 사용하는 별칭을 만들 수 있습니다. 표기법은 다음과 같았습니다.
alias junk="mv \\!* ~/.Trash"
Bash에서는 이것이 작동하지 않는 것 같습니다. Bash에 유용한 기능이 많다는 점을 감안할 때 이 기능이 구현되었다고 가정하지만 어떻게 구현되었는지 궁금합니다.
Bash 별칭은 매개변수를 직접 허용하지 않습니다. 함수를 생성해야 합니다.
alias
는 매개변수를 허용하지 않지만 함수는 별칭처럼 호출할 수 있습니다. 예를 들어:
myfunction() { #do things with parameters like $1 such as mv "$1" "$1.bak" cp "$2" "$1" } myfunction old.conf new.conf #calls `myfunction`
.bashrc
및 기타 파일에 정의된 Bash 함수는 셸 내에서 명령으로 사용할 수 있습니다. 예를 들어 다음과 같이 이전 함수를 호출할 수 있습니다.
$ myfunction original.conf my.conf
위의 답변을 구체화하면 셸 또는 .bashrc 파일의 임시 정의에 더 편리한 별칭과 같은 한 줄 구문을 얻을 수 있습니다.
bash$ myfunction() { mv "$1" "$1.bak" && cp -i "$2" "$1"; } bash$ myfunction original.conf my.conf
닫는 오른쪽 대괄호 앞의 세미콜론을 잊지 마십시오. 마찬가지로 실제 질문의 경우:
csh% alias junk="mv \\!* ~/.Trash" bash$ junk() { mv "$@" ~/.Trash/; }
또는:
bash$ junk() { for item in "$@" ; do echo "Trashing: $item" ; mv "$item" ~/.Trash/; done; }
질문은 단순히 잘못되었습니다. alias
는 이미 존재하는 것에 대한 두 번째 이름을 추가하기 때문에 매개변수를 사용하는 별칭을 만들지 않습니다. OP가 원하는 function
은 새로운 기능을 생성하는 기능 명령입니다. 함수에 이미 이름이 있으므로 함수에 별칭을 지정할 필요가 없습니다.
나는 당신이 다음과 같은 것을 원한다고 생각합니다.
function trash() { mv "$@" ~/.Trash; }
그게 다야! 매개변수 $1, $2, $3 등을 사용하거나 모두 $@로 채울 수 있습니다.
명령 중간에 인수를 넣는 별칭보다 함수를 사용하는 것이 훨씬 쉽고 읽기 쉽습니다.
$ wrap_args() { echo "before $@ after"; } $ wrap_args 1 2 3 before 1 2 3 after
계속 읽으면 쉘 인수 처리에 대해 알 필요가 없는 것들을 배우게 될 것입니다. 지식은 위험합니다. 어두운 면이 당신의 운명을 영원히 지배하기 전에 원하는 결과를 얻으십시오.
bash
별칭 은 인수를 허용하지만 끝에 만 허용됩니다.
$ alias speak=echo $ speak hello world hello world
alias
통해 명령 중간 에 인수를 넣는 것은 실제로 가능하지만 보기 흉해집니다.
한계를 우회하고 다른 사람들이 불가능하다고 말하는 것을 하는 것을 좋아한다면 여기 레시피가 있습니다. 머리가 푸석푸석해지고 얼굴이 그을음 미친 과학자 스타일로 뒤덮인다고 해도 나를 비난하지 마세요.
해결 방법은 alias
가 끝에만 허용하는 인수를 중간에 삽입한 다음 명령을 실행하는 래퍼에 전달하는 것입니다.
기능 자체를 사용하는 것에 정말로 반대한다면 다음을 사용할 수 있습니다.
$ alias wrap_args='f(){ echo before "$@" after; unset -ff; }; f' $ wrap_args xyz before xyz after
첫 번째 인수만 원하는 경우 $@
를 $1
바꿀 수 있습니다.
설명 1
이렇게 하면 인수가 전달되는 f
가 생성됩니다 f
는 맨 마지막에 호출됩니다). unset -f
는 별칭이 실행될 때 함수 정의를 제거하므로 나중에 중단되지 않습니다.
서브쉘을 사용할 수도 있습니다:
$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'
설명 2
별칭은 다음과 같은 명령을 빌드합니다.
sh -c 'echo before "$@" after' _
코멘트:
자리 표시자 _
는 필수이지만 무엇이든 될 수 있습니다. sh
의 $0
설정되고 사용자가 제공한 첫 번째 인수가 소비되지 않도록 하기 위해 필요합니다. 데모:
sh -c 'echo Consumed: "$0" Printing: "$@"' alcohol drunken babble Consumed: alcohol Printing: drunken babble
작은 따옴표 안에 작은 따옴표가 필요합니다. 다음은 큰따옴표로 작동하지 않는 예입니다.
$ sh -c "echo Consumed: $0 Printing: $@" alcohol drunken babble Consumed: -bash Printing:
여기서 대화형 쉘의 $0
및 $@
sh
전달 되기 전에 큰따옴표로 바뀝니다. 증거는 다음과 같습니다.
echo "Consumed: $0 Printing: $@" Consumed: -bash Printing:
작은 따옴표는 이러한 변수가 대화식 셸에서 해석되지 않도록 하고 문자 그대로 sh -c
전달됩니다.
당신은 큰 따옴표를 사용할 수 있고 \$@
하지만 가장 좋은 방법은 (그들이 공백을 포함 할 수 있기 때문에) 당신의 주장을 인용,하는 것입니다 \"\$@\"
외모도 추악한,하지만 당신은 머리를 닳게 난독의 대회에서 우승 도움이 될 수 있습니다 진입 전제조건이다.
대체 솔루션은 최근에 만든 도구인 marker 를 사용하여 명령 템플릿을 "책갈피"하고 명령 자리 표시자에 쉽게 커서를 놓을 수 있도록 하는 것입니다.
대부분의 경우 쉘 기능을 사용하므로 자주 사용하는 명령을 명령줄에 반복해서 작성할 필요가 없습니다. 이 사용 사례에서 함수를 사용하는 문제는 내 명령 어휘에 새로운 용어를 추가하고 실제 명령에서 어떤 함수 매개변수를 참조하는지 기억해야 한다는 것입니다. 마커 목표는 그 정신적 부담을 없애는 것입니다.
별칭 안에 함수를 만들기만 하면 됩니다.
$ alias mkcd='_mkcd(){ mkdir "$1"; cd "$1";}; _mkcd' ^ * ^ ^ ^ ^ ^
작은따옴표는 작동하지 않으므로 "$1" 주위에 큰따옴표 를 넣어야 합니다. 화살표로 표시된 곳에서 따옴표를 충돌하면 시스템이 혼동되기 때문입니다. 또한 기능을 위해서는 별표가 표시된 곳의 여백이 필요합니다.
일단 재미있는 프로젝트를 했고 여전히 그것을 사용합니다. cp
명령을 통해 파일을 복사하는 동안 일부 애니메이션이 표시됩니다. cp
는 아무 것도 표시하지 않고 일종의 좌절감을 줍니다. 그래서 이 별칭을 만들었습니다.
alias cp="~/SCR/spiner cp"
그리고 이것은 스피너 스크립트입니다.
#!/bin/bash #Set timer T=$(date +%s) #Add some color . ~/SCR/color #Animation sprites sprite=( "(* ) ( *)" " (* )( *) " " ( *)(* ) " "( *) (* )" "(* ) ( *)" ) #Print empty line and hide cursor printf "\n${COF}" #Exit function function bye { printf "${CON}"; [ -e /proc/$pid ] && kill -9 $pid; exit; }; trap bye INT #Run our command and get its pid "$@" & pid=$! #Waiting animation i=0; while [ -e /proc/$pid ]; do sleep 0.1 printf "\r${GRN}Please wait... ${YLW}${sprite[$i]}${DEF}" ((i++)); [[ $i = ${#sprite[@]} ]] && i=0 done #Print time and exit T=$(($(date +%s)-$T)) printf "\n\nTime taken: $(date -u -d @${T} +'%T')\n" bye
이렇게 생겼어요
순환 애니메이션)
다음은 위에서 언급한 컬러 스크립트에 대한 링크입니다. 그리고 새로운 애니메이션 주기)
Bash 별칭은 절대적으로 매개변수를 허용합니다. 방금 앱 이름을 매개변수로 받아들이는 새로운 반응 앱을 만들기 위해 별칭을 추가했습니다. 내 과정은 다음과 같습니다.
nano에서 편집하기 위해 bash_profile을 엽니다.
nano /.bash_profile
한 줄에 하나씩 별칭을 추가합니다.
alias gita='git add .' alias gitc='git commit -m "$@"' alias gitpom='git push origin master' alias creact='npx create-react-app "$@"'
참고: "$@"는 "creact my-new-app"과 같이 전달된 매개변수를 허용합니다.
나노 편집기 저장 및 종료
ctrl+o 쓰기(Enter 키); ctrl+x 종료
.bash_profile에서 새 별칭을 사용하도록 터미널에 지시
source /.bash_profile
그게 다야! 이제 새 별칭을 사용할 수 있습니다.
별칭 중간에 매개변수를 삽입할 수 없다고 말하는 모든 사람들에게 존경스럽게도 방금 테스트한 결과 제대로 작동하는 것으로 나타났습니다.
alias mycommand = "python3 "$1" script.py --folderoutput RESULTS/"
그런 다음 mycommand foobar를 실행했을 때 명령을 직접 입력한 것처럼 정확히 작동했습니다.
다음은 기본적 으로 매개변수를 허용하는 별칭인 ~/.bashrc
있는 함수의 세 가지 예입니다.
#Utility required by all below functions. #https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-bash-variable#comment21953456_3232433 alias trim="sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*\$//g'"
.
:<<COMMENT Alias function for recursive deletion, with are-you-sure prompt. Example: srf /home/myusername/django_files/rest_tutorial/rest_venv/ Parameter is required, and must be at least one non-whitespace character. Short description: Stored in SRF_DESC With the following setting, this is *not* added to the history: export HISTIGNORE="*rm -r*:srf *" - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash See: - y/n prompt: https://stackoverflow.com/a/3232082/2736496 - Alias w/param: https://stackoverflow.com/a/7131683/2736496 COMMENT #SRF_DESC: For "aliaf" command (with an 'f'). Must end with a newline. SRF_DESC="srf [path]: Recursive deletion, with y/n prompt\n" srf() { #Exit if no parameter is provided (if it's the empty string) param=$(echo "$1" | trim) echo "$param" if [ -z "$param" ] #http://tldp.org/LDP/abs/html/comparison-ops.html then echo "Required parameter missing. Cancelled"; return fi #Actual line-breaks required in order to expand the variable. #- https://stackoverflow.com/a/4296147/2736496 read -r -p "About to sudo rm -rf \"$param\" Are you sure? [y/N] " response response=${response,,} # tolower if [[ $response =~ ^(yes|y)$ ]] then sudo rm -rf "$param" else echo "Cancelled." fi }
.
:<<COMMENT Delete item from history based on its line number. No prompt. Short description: Stored in HX_DESC Examples hx 112 hx 3 See: - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string COMMENT #HX_DESC: For "aliaf" command (with an 'f'). Must end with a newline. HX_DESC="hx [linenum]: Delete history item at line number\n" hx() { history -d "$1" }
.
:<<COMMENT Deletes all lines from the history that match a search string, with a prompt. The history file is then reloaded into memory. Short description: Stored in HXF_DESC Examples hxf "rm -rf" hxf ^source Parameter is required, and must be at least one non-whitespace character. With the following setting, this is *not* added to the history: export HISTIGNORE="*hxf *" - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash See: - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string COMMENT #HXF_DESC: For "aliaf" command (with an 'f'). Must end with a newline. HXF_DESC="hxf [searchterm]: Delete all history items matching search term, with y/n prompt\n" hxf() { #Exit if no parameter is provided (if it's the empty string) param=$(echo "$1" | trim) echo "$param" if [ -z "$param" ] #http://tldp.org/LDP/abs/html/comparison-ops.html then echo "Required parameter missing. Cancelled"; return fi read -r -p "About to delete all items from history that match \"$param\". Are you sure? [y/N] " response response=${response,,} # tolower if [[ $response =~ ^(yes|y)$ ]] then #Delete all matched items from the file, and duplicate it to a temp #location. grep -v "$param" "$HISTFILE" > /tmp/history #Clear all items in the current sessions history (in memory). This #empties out $HISTFILE. history -c #Overwrite the actual history file with the temp one. mv /tmp/history "$HISTFILE" #Now reload it. history -r "$HISTFILE" #Alternative: exec bash else echo "Cancelled." fi }
참조:
하나 또는 둘 또는 기타 하드코딩된 양뿐만 아니라 모든 매개변수를 함수에 적용하는 일반적인 방법을 찾고 있다면 다음과 같이 할 수 있습니다.
#!/usr/bin/env bash # you would want to `source` this file, maybe in your .bash_profile? function runjar_fn(){ java -jar myjar.jar "$@"; } alias runjar=runjar_fn;
runjar
를 실행할 때부터 모든 매개변수를 별칭으로 전달합니다.
예를 들어, 내가 runjar hi there
java -jar myjar.jar hi there
실행하게 될 것입니다. 내가 runjar one two three
java -jar myjar.jar one two three
가 실행됩니다.
$@
기반 솔루션을 좋아합니다. 왜냐하면 그것이 매개변수의 수에 관계없이 작동하기 때문입니다.
주의: 아이디어가 명확하지 않은 경우 별칭을 제외한 모든 것에 별칭을 사용하는 것은 나쁜 생각입니다. 또한, 결함이있다 (내가 분명 것이라고 생각하지만, 단지 경우에 당신은 혼란스러워! 난 아무데도 ... 사용 실제로 수를 의미하지 않는다)
........................................................................... ........................................................................... ...........................................................
나는 전에 이것에 대해 대답했고 과거에는 항상 다음과 같았습니다.
alias foo='__foo() { unset -f $0; echo "arg1 for foo=$1"; }; __foo()'
기능을 모두 함께 사용하지 않는 한 괜찮고 좋습니다. 이 경우 bash의 방대한 텍스트 리디렉션 기능을 활용할 수 있습니다.
alias bar='cat <<< '\''echo arg1 for bar=$1'\'' | source /dev/stdin'
둘 다 길이가 거의 같으며 몇 문자를 주거나 받습니다.
실제 키커는 시차이며, 상단은 '함수 방식'이고 하단은 '리디렉트 소스' 방식입니다. 이 이론을 증명하기 위해 타이밍 자체가 다음과 같이 말합니다.
arg1 for foo=FOOVALUE real 0m0.011s user 0m0.004s sys 0m0.008s # <--time spent in foo real 0m0.000s user 0m0.000s sys 0m0.000s # <--time spent in bar arg1 for bar=BARVALUE ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE arg1 for foo=FOOVALUE real 0m0.010s user 0m0.004s sys 0m0.004s real 0m0.000s user 0m0.000s sys 0m0.000s arg1 for bar=BARVALUE ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE arg1 for foo=FOOVALUE real 0m0.011s user 0m0.000s sys 0m0.012s real 0m0.000s user 0m0.000s sys 0m0.000s arg1 for bar=BARVALUE ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE arg1 for foo=FOOVALUE real 0m0.012s user 0m0.004s sys 0m0.004s real 0m0.000s user 0m0.000s sys 0m0.000s arg1 for bar=BARVALUE ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE arg1 for foo=FOOVALUE real 0m0.010s user 0m0.008s sys 0m0.004s real 0m0.000s user 0m0.000s sys 0m0.000s arg1 for bar=BARVALUE
이것은 무작위 간격으로 수행된 약 200개 결과의 하단 부분입니다. 함수 생성/파괴는 리디렉션보다 시간이 더 많이 걸리는 것 같습니다. 바라건대 이것은 미래의 방문자가 이 질문에 도움이 되기를 바랍니다.
통사론:
alias shortName="your custom command here"
예시:
alias tlogs='_t_logs() { tail -f ../path/$1/to/project/logs.txt ;}; _t_logs'
임의의 인수를 재배치하는 메커니즘이 없는 bash 별칭 문제에 대한 일반화된 솔루션을 원하는 합법적인 기술적 이유가 있습니다. 한 가지 이유는 실행하려는 명령이 기능 실행으로 인한 환경 변경으로 인해 부정적인 영향을 받는 경우입니다. 다른 모든 경우에는 함수를 사용해야 합니다.
최근에 이에 대한 해결책을 시도하게 된 이유는 변수와 함수의 정의를 인쇄하기 위한 몇 가지 축약된 명령을 만들고 싶었기 때문입니다. 그래서 그 목적을 위해 몇 가지 기능을 작성했습니다. 그러나 함수 호출 자체에 의해 변경되는(또는 변경될 수 있는) 특정 변수가 있습니다. 그 중에는 다음이 있습니다.
FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV
내가 (함수에서) 변수 defns를 인쇄하기 위해 사용했던 기본 명령. set 명령의 출력 형식은 다음과 같습니다.
sv () { set | grep --color=never -- "^$1=.*"; }
예:
> V=voodoo sv V V=voodoo
문제: 이것은 현재 컨텍스트 에 있는 것처럼 위에서 언급한 변수의 정의를 인쇄하지 않습니다. 그러나 내 기능은 잘못된 정보를 알려줍니다.
> sv FUNCNAME FUNCNAME=([0]="sv")
내가 생각해 낸 한 가지 솔루션은 이 주제에 대한 다른 게시물에서 다른 사람들이 언급했습니다. 변수 defns를 인쇄하는 이 특정 명령에 대해 하나의 인수만 필요로 하기 위해 다음을 수행했습니다.
alias asv='(grep -- "^$(cat -)=.*" <(set)) <<<'
올바른 출력(없음)과 결과 상태(거짓)를 제공합니다.
> asv FUNCNAME > echo $? 1
그러나 나는 여전히 임의의 수의 인수에 대해 작동하는 솔루션을 찾아야 한다고 느꼈습니다.
임의의 인수를 Bash 별칭 명령에 전달하는 일반적인 솔루션:
# (I put this code in a file "alias-arg.sh"): # cmd [arg1 ...] – an experimental command that optionally takes args, # which are printed as "cmd(arg1 ...)" # # Also sets global variable "CMD_DONE" to "true". # cmd () { echo "cmd($@)"; declare -g CMD_DONE=true; } # Now set up an alias "ac2" that passes to cmd two arguments placed # after the alias, but passes them to cmd with their order reversed: # # ac2 cmd_arg2 cmd_arg1 – calls "cmd" as: "cmd cmd_arg1 cmd_arg2" # alias ac2=' # Set up cmd to be execed after f() finishes: # trap '\''cmd "${CMD_ARGV[1]}" "${CMD_ARGV[0]}"'\'' SIGUSR1; # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # (^This is the actually execed command^) # # f [arg0 arg1 ...] – acquires args and sets up trap to run cmd: f () { declare -ag CMD_ARGV=("$@"); # array to give args to cmd kill -SIGUSR1 $$; # this causes cmd to be run trap SIGUSR1; # unset the trap for SIGUSR1 unset CMD_ARGV; # clean up env... unset f; # incl. this function! }; f' # Finally, exec f, which will receive the args following "ac2".
예:
> . alias-arg.sh > ac2 one two cmd(two one) > > # Check to see that command run via trap affects this environment: > asv CMD_DONE CMD_DONE=true
이 솔루션의 좋은 점은 위치 매개변수(인수)를 명령에 처리하는 데 사용되는 모든 특수 트릭이 트랩된 명령을 작성할 때 작동한다는 것입니다. 유일한 차이점은 배열 구문을 사용해야 한다는 것입니다.
예,
"$@"를 원하시면 "${CMD_ARGV[@]}"를 사용하세요.
"$#"을 원하시면 "${#CMD_ARGV[@]}"를 사용하세요.
등.
다른 사람들이 이미 지적했듯이 함수를 사용하는 것은 모범 사례로 간주되어야 합니다.
xargs
활용하는 또 다른 접근 방식이 있습니다.
alias junk="xargs -I "{}" -- mv "{}" "~/.Trash" <<< "
이것은 스트림 리디렉션과 관련하여 부작용이 있음을 유의하십시오.
파일을 삭제하는 대신 휴지통 폴더로 이동하기 위해 별칭을 만드는 것에 대해 제기된 질문에 대한 구체적인 답변을 제공하려면:
alias rm="mv "$1" -t ~/.Trash/"
당연히 dir ~/.Trash를 먼저 만들어야 합니다.
그런 다음 다음 명령을 내리십시오.
$rm <filename> $rm <dirname>
나는 (미래의 독자와 가장 중요한 편집자를 위해) 내 (잘하면, 알았어) 솔루션을 게시할 것입니다.
따라서 이 게시물의 내용을 수정 및 개선/제거하십시오.
터미널에서:
$ alias <name_of_your_alias>_$argname="<command> $argname"
그리고 그것을 사용하려면('_' 뒤의 공백에 주의하세요.
$<name_of_your_alias>_ $argname
예를 들어, hello.txt
라는 파일 cat
대한 별칭:
CAT_FILE_
)$f
(이 예에서 파일인 $argname
$ alias CAT_FILE_$f="cat $f" $ echo " " >> hello.txt $ echo "hello there!" >> hello.txt $ echo " " >> hello.txt $ cat hello.txt hello there!
테스트('_' 뒤의 공백에 주의):
CAT_FILE_ hello.txt
매개변수를 사용하려면 함수를 사용해야 합니다!
그러나 별칭을 실행하는 대신 별칭을 만들 때 $@ get이 해석되고 $를 이스케이프해도 작동하지 않습니다. 이 문제를 어떻게 해결합니까?
이 문제를 해결하려면 별칭 대신 쉘 함수를 사용해야 합니다. foo를 다음과 같이 정의할 수 있습니다.
function foo() { /path/to/command "$@" ;}
또는
foo() { /path/to/command "$@" ;}
마지막으로 다음 구문을 사용하여 foo()를 호출합니다.
foo arg1 arg2 argN
~/.bash_profile
또는 ~/.zshrc
파일에 foo()를 추가했는지 확인하십시오.
귀하의 경우 이것이 효과가 있습니다
function trash() { mv $@ ~/.Trash; }
예는 다음과 같습니다.
alias gcommit='function _f() { git add -A; git commit -m "$1"; } ; _f'
매우 중요:
{
뒤와 }
앞에 공백이 있습니다.;
순서대로 각 명령 뒤에. 마지막 명령 이후에 이것을 잊어버리면 >
프롬프트가 표시됩니다!"$1"
로 따옴표로 묶입니다.함수는 이미 충분히 기여하고 man 페이지의 다음 인용문에 의해 확인된 바와 같이 실제로 거의 항상 답입니다. "거의 모든 목적에서 별칭은 쉘 함수로 대체됩니다."
완전성을 위해 그리고 이것이 유용할 수 있기 때문에(약간 더 가벼운 구문) 매개변수가 별칭을 따를 때 여전히 사용할 수 있습니다(이것이 OP의 요구 사항을 해결하지는 않지만). 이것은 아마도 예를 들어 설명하는 것이 가장 쉬울 것입니다:
alias ssh_disc='ssh -O stop'
ssh_disc myhost
와 같은 smth를 입력할 수 있습니다. 예상대로 확장됩니다. ssh -O stop myhost
이것은 복잡한 인수를 사용하는 명령에 유용할 수 있습니다(내 메모리는 더 이상 사용하지 않습니다...)
함수와 별칭 모두 여기에 표시된 것처럼 매개변수를 사용할 수 있습니다. 추가로 몇 가지 다른 측면을 지적하고 싶습니다.
1. 함수는 자체 범위에서 실행되고 별칭은 범위를 공유합니다.
무언가를 숨기거나 노출해야 하는 경우 이 차이점을 아는 것이 유용할 수 있습니다. 또한 함수가 캡슐화에 더 나은 선택임을 암시합니다.
function tfunc(){ GlobalFromFunc="Global From Func" # Function set global variable by default local FromFunc="onetwothree from func" # Set a local variable } alias talias='local LocalFromAlias="Local from Alias"; GlobalFromAlias="Global From Alias" # Cant hide a variable with local here ' # Test variables set by tfunc tfunc # call tfunc echo $GlobalFromFunc # This is visible echo $LocalFromFunc # This is not visible # Test variables set by talias # call talias talias echo $GlobalFromAlias # This is invisible echo $LocalFromAlias # This variable is unset and unusable
산출:
bash-3.2$ # Test variables set by tfunc bash-3.2$ tfunc # call tfunc bash-3.2$ echo $GlobalFromFunc # This is visible Global From Func bash-3.2$ echo $LocalFromFunc # This is not visible bash-3.2$ # Test variables set by talias bash-3.2$ # call talias bash-3.2$ talias bash: local: can only be used in a function bash-3.2$ echo $GlobalFromAlias # This is invisible Global From Alias bash-3.2$ echo $LocalFromAlias # This variable is unset and unusable
2. 래퍼 스크립트가 더 나은 선택입니다.
ssh
를 통해 로그인 하거나 사용자 이름 또는 다중 사용자 환경을 전환할 때 별칭 또는 기능을 찾을 수 없는 경우가 여러 번 발생했습니다. 도트 파일 소싱에 대한 팁과 트릭이 있습니다. alias sd='sudo '
사용하면 이 후속 alias install='sd apt-get install'
sd='sudo '
의 추가 공간에 주의하세요. sd='sudo '
). 그러나 이와 같은 경우 래퍼 스크립트가 함수나 별칭보다 더 잘 작동합니다. 래퍼 스크립트의 주요 장점은 의도된 경로(예: /usr/loca/bin/)에서 볼 수 있고 실행할 수 있다는 것입니다. bash
경우 ~/.bash_profile 또는 ~/.bashrc에 함수를 넣었지만 나중에 다른 셸(예: zsh
)로 전환하면 함수가 더 이상 표시되지 않습니다. 따라서 의심스러운 경우 래퍼 스크립트는 항상 가장 안정적이고 이식 가능한 솔루션입니다.
하위 명령이 있는 솔루션:
d () { if [ $# -eq 0 ] ; then docker return 0 fi CMD=$1 shift case $CMD in p) docker ps --all $@ ;; r) docker run --interactive --tty $@ ;; rma) docker container prune docker image prune --filter "dangling=true" ;; *) docker $CMD $@ ;; esac return $? }
사용:
$ dr my_image ...
라고 불리는:
docker run --interactive --tty my_image ...
read
사용하는 또 다른 접근 방식입니다. "permission denied" 메시지를 무시하고 이름 조각으로 파일을 무차별적으로 검색하는 데 이것을 사용하고 있습니다.
alias loc0='{ IFS= read -rx; find . -iname "*" -print 2>/dev/null | grep $x;} <<<'
간단한 예:
$ { IFS= read -rx; echo "1 $x 2 ";} <<< "ab" 1 ab 2
이것은 인수를 문자열로 변수로 변환합니다. 이를 위해 공백으로 구분된 따옴표 안에 여러 매개변수를 사용할 수 있습니다.
$ { read -r x0 x1; echo "1 ${x0} 2 ${x1} 3 ";} <<< "ab" 1 a 2 b 3
출처 : http:www.stackoverflow.com/questions/7131670/make-a-bash-alias-that-takes-a-parameter
UNION과 UNION ALL의 차이점은 무엇입니까? (0) | 2022.02.19 |
---|---|
문자열이 유효한 숫자인지 확인하는 JavaScript의 (내장) 방법 (0) | 2022.02.19 |
Memcached 대 Redis? [닫은] (0) | 2022.02.19 |
JavaScript 정규식에서 일치하는 그룹에 어떻게 액세스합니까? (0) | 2022.02.19 |
rvalue, lvalue, xvalue, glvalue 및 prvalue는 무엇입니까? (0) | 2022.02.19 |