예를 들어 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
. 이는 별칭 확장, 변수 확장 등 후에 실행된 명령을 표시하도록 쉘에 메시지를 표시합니다.pdksh
zsh
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
안타깝게도,역사명령은 별칭만 표시하므로 이 경우 실제 명령이 실행되었는지 확인하기 위해 기록을 사용할 수 없으며 별칭 태그만 검색할 수 있습니다.