별칭이나 함수를 통해 셸에서 실행되는 실제 명령을 보는 방법

별칭이나 함수를 통해 셸에서 실행되는 실제 명령을 보는 방법

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

답변1

set -x쉘에서 사용됩니다.

$ alias hello='echo hello world!'
$ hello
hello world!
$ set -x
$ hello
+ echo hello world!
hello world!

set -x개방형 셸 옵션을 사용하고 xtrace( set +x해제) , 및 와 같은 모든 Bourne 유사 셸에서 작동해야 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!

귀하의 구체적인 예를 바탕으로 (문법 수정 및 따옴표 추가):

$ install () { sudo apt-get install "$@"; }
$ set -x
$ install dicelab
+ install dicelab
+ sudo apt-get install dicelab
bash: sudo: command not found

(내 시스템에 사용되거나 설치되지 않았 sudo으므로 이 오류가 예상됩니다.)

공통 유틸리티가 호출되었으므로 특정 시점에 해당 유틸리티를 사용하려면 install함수 이름을 다른 이름(?)으로 지정해야 할 수도 있습니다.aptin


추적 출력은 다음과 같습니다.디버그 출력. 이것은표현하다명령을 실행할 때 쉘이 수행하는 작업입니다. 화면에 표시되는 출력이 셸 입력에 맞지 않을 수 있습니다.

또한 나는 bash. 다른 쉘에는 또 다른 기본 추적 프롬프트(예 zsh: 현재 명령의 문자열 및 기록 번호 포함)가 있거나 zsh중첩된 호출과 같은 프롬프트가 "스택"되지 않을 수 있습니다.bash


기본적으로 모든 대화형 셸에서 실행 했던 것과 동일한 명령을 실행하고 있습니다 set -x. 실제로 실행되는 내용을 확인하면 좋을 것입니다. 하지만 프로그래밍 가능한 탭 완성 등으로 인해 일부 셸에서 원치 않는 추적 출력이 발생할 수 있고 일부 셸의 기본 추적 출력이 약간 장황하다는 것을 알았습니다(예: zsh).

답변2

기본적으로 - - shell-expand-line에 바인딩되어 사용할 수 있습니다 .ControlAlte

$ 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

답변3

내장된 명령을 사용하여 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

From help type: -a"-p" 옵션이 사용되지 않는 경우에만 NAME이라는 실행 파일이 포함된 모든 위치를 표시합니다.

$ function hello() { echo hello; }  # define function
$ type hello
hello is a function
hello () 
{ 
    echo hello
}

답변4

특정 별칭을 사용하는 쉬운 방법은 다음과 같습니다..

당신이 그렇게한다면ps-f, 프로세스 옆에 실제 명령이 표시됩니다.아니요이것이름. 다음 별칭을 정의하여 이를 확인할 수 있습니다.

alias doSleep="sleep 100"

그럼 해

ps -f | grep "sleep"

너는 보게 될 것이다

username   14303    2409  0 15:16 pts/0    00:00:00 sleep 100

안타깝게도,명령은 별칭만 표시하므로 이 경우 실제 명령이 실행되었는지 확인하기 위해 기록을 사용할 수 없으며 별칭 태그만 검색할 수 있습니다.

관련 정보