별명이나 함수를 통해 쉘에서 실제로 실행 된 명령을 어떻게 알 수 있습니까?


20

예를 들어 bash 함수 (또는 별칭)가 function install() {sudo apt-get install $@}있습니다. 명령을 실행할 때 install dicelab실제로 실행될 것으로 예상됩니다 sudo apt-get install dicelab. 실제로 쉘이 실행 한 것을 어디에서 볼 수 있습니까? 더 복잡한 별칭이 예상대로 작동하는지 확인하고 싶습니다.


$@별명의 일부? 별명은 실제로 별명을 호출하는 컨텍스트의 위치 매개 변수 (있는 경우)로 확장되는 인수를 지원하지 않습니다. 일반적인 실행 방법은 somealias some args별명을 확장하고 인수를 따라가는 것만으로 작동합니다. 실제로 인수에 액세스하려면 함수를 사용하고"$@"
ilkkachu를


1
@AlonAviv, 좋습니다. :) 여전히 인용 부호를 사용하는 것이 가장 좋습니다. "$@"공백이나 glob 문자가있는 인수는 그렇지 않으면 불타 버립니다.
ilkkachu

1
@DarkHeart 중복이 없습니다. 다른 질문은 쉘 기능과 관련이 없습니다.
Kusalananda

2
주제를 완전히 변경하고 기존 답변 중 하나를 무효화하기 위해 편집 될 때 까지이 내용도 아닙니다.
Michael Homer

답변:


29

set -x껍질에 사용하십시오 .

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

사용 set -x상의 회전을 xtrace쉘 옵션 ( set +x를 꺼짐) 및 작동해야 모든 본쉘, 같은 bash, dash ksh93, pdkshzsh. 별명 확장 및 변수 확장 등이 수행 된 후 실행되는 명령을 표시하도록 쉘에 프롬프트합니다.

출력은 쉘의 표준 오류 스트림 (일반 프롬프트와 동일)에 있으므로 표준 출력의 경로 재 지정을 방해하지 않으며 PS4쉘 변수에 의해 정의 된 프롬프트 ( +␣기본적으로) 가 앞에옵니다 .

몇 가지 기능이 포함 된 예 :

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

set -x기본적으로 모든 대화식 쉘에서 실행 중입니다 . 실제로 실행 된 것을 보는 것이 좋지만 ... 프로그래밍 가능한 탭 완성 등으로 인해 일부 쉘에서 원하지 않는 추적 출력이 발생할 수 있음을 알았습니다.


14

당신이 사용할 수있는 shell-expand-line결합되는, Control- Alt- e: 기본적으로

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

당신은 아직도 명령 볼 수 있도록 무엇보다도, 그것은 그들의 정의에 현재 행에 별명을 대체 할 예정 실행합니다. 예:

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this

이것은 좋은 기능입니다. zsh에 해당하는 명령이 있는지 알고 shell-expand-line있습니까?
the_velour_fog

죄송합니다 zsh. 사용하지 않기 때문 입니다. : 그러나 어떤 사람들은 자신의 아이디어와 함께 올라와있다 wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
ARKADIUSZ Drabczyk


1

bash 내장 type을 사용하여 실행할 별명 또는 함수 정의를 볼 수 있습니다.

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.