$_
Bash 매뉴얼의 다음 문장 , 특히 굵은 부분을 설명해 주시겠습니까 ? 몇 가지 예를 들어 주시겠습니까?
쉘이 시작되면 쉘 또는 실행 중인 쉘 스크립트를 호출하는 데 사용되는 절대 경로 이름으로 설정하십시오.환경 또는 매개변수 목록 전달.
그후, 이전 명령의 마지막 매개변수로 확장됩니다.
또한 전체 경로 이름으로 설정됩니다.실행된 각 명령을 호출하는 데 사용됩니다.그리고명령으로 내보낸 환경에 배치됨.
언제이메일 확인 중, 이 매개변수는 메일 파일의 이름을 저장합니다.
답변1
나는 그것이 명확하지 않다는 데 동의합니다.
1. 쉘이 시작되면,
변수가 수신된
_
환경 에 있는 경우bash
,bash
변경되지 않은 상태로 유지됩니다.특히, 쉘이
bash
다른 쉘에 의해 호출되는 경우(일부 구현에서는 그렇습니다) 쉘은 환경 변수를 실행 중인 명령의 경로로 설정합니다(질문의 세 번째 요점). 예를 들어, 다른 쉘 해석의 결과로 스크립트를 해석하기 위해 if를 호출하면 다음과 같습니다.bash
zsh
yash
ksh
bash
_
bash
bash
bash-script some args
이는 스크립트를 해석하는 셸 변수의 초기 값인 환경으로
bash
전달됩니다 ._=/path/to/bash-scrip
bash-script
$_
bash
bash
$ env -i _=whatever bash -c 'echo "$_"' whatever
지금,호출 애플리케이션이
_
환경 변수를 전달하지 않는 경우, 호출된 쉘은 이를 수신할 때 자체적으로bash
초기화됩니다 . 이는 , 또는 또는 또는 다른 것일 수 있습니다(위 예에서 스크립트의 she-bang이 또는$_
argv[0]
bash
/path/to/bash
/path/to/some-script
/bin/bash
#! /bin/bash
/path/to/bash-script
시스템에 따라 다름).bash
따라서 이 텍스트는 호출자가 제어할 수 없는 동작을 설명하므로 오해의 소지가 있습니다. 호출 응용 프로그램이 이를 전혀 설정하지 않거나(실제로 일부 셸과 일부 드문 대화형 응용 프로그램에서만 이 작업을 수행합니다. 예를 들어 설정하지 않음) 완전히 다른 용도로 사용할 수 있습니다(예:bash
로 설정 ).$_
execlp()
ksh93
*pid*/path/to/command
$ env bash -c 'echo "$_"' /usr/bin/env (env did not set it to /bin/bash, so the value we get is the one passed to env by my interactive shell) $ ksh93 -c 'bash -c "echo \$_"' *20042*/bin/bash
2. 이후
이것그후그다지 명확하지도 않습니다. 실제로 한 번 bash
설명하면간단한 명령현재 쉘 환경에서.
대화형 쉘의 경우
/etc/bash.bashrc
, 이는 예를 들어 설명된 첫 번째 간단한 명령 입니다 .예를 들어 대화형 셸 프롬프트에서 다음을 수행합니다.
$ echo "$_" ] (the last arg of the last command from my ~/.bashrc) $ f() { echo test; } $ echo "$_" ] (the command-line before had no simple command, so we get the last argument of that previous echo commandline) $ (: test) $ echo "$_" ] (simple command, but in a sub-shell environment) $ : test $ echo "$_" test
비대화형 쉘의 경우
$BASH_ENV
, 설정되지 않은 경우 해당 셸의 코드에 입력된 첫 번째 명령이 됩니다 .$BASH_ENV
3. Bash가 명령을 실행할 때
세 번째 요점은 다르며 위의 논의에서 암시됩니다.
bash
_
다른 쉘과 마찬가지로 시스템 호출의 첫 번째 인수로 사용되는 경로를 포함하는 환경 변수를 실행하는 명령에 전달합니다 .bash
execve()
$ env | grep '^_'
_=/usr/bin/env
4. 이메일 확인 시
네 번째 사항은 변수 설명에 자세히 설명되어 있습니다 MAILPATH
.
"메일 경로"
콜론으로 구분된 목록쉘은 정기적으로 새 메일의 파일 이름을 확인합니다..
각 목록 항목을 지정할 수 있습니다.메일 파일에 새 메일이 도착하면 인쇄되는 메시지파일 이름과 메시지를 "?"로 구분하여 메시지 텍스트에 사용되면 "$_"는 현재 메일 파일의 이름으로 확장됩니다.
예:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>
답변2
다음의 간단한 예를 시도해 보세요.
echo "$_"
echo "test"
echo "$_"
절대 경로( )를 제공하여 /home/$USERNAME/test.sh
실행합니다 .
/home/$USERNAME/test.sh
test
test
첫 번째에는 $_
스크립트를 호출하는 데 사용되는 경로가 포함되고 두 번째에는 middle 에 대한 첫 번째 인수가 포함됩니다 echo
. 목록의 세 번째 항목에 대해 새 터미널을 시작하고 echo를 입력하면 명령(내 Ubuntu 컴퓨터에 있음) 또는 일반 터미널에서 찾아서 호출하는 데 일반적으로 사용하는 파일에 대한 절대 경로가 $_
포함된 명령이 표시됩니다. 쉘. 로그인 쉘을 변수화합니다.PATH
.bashrs
Bash 매뉴얼 페이지의 네 번째 항목:
메시지 텍스트에 사용될 경우
$_
현재 메일 파일의 이름으로 확장됩니다.
답변3
사례 2의 경우 예는 천 단어의 가치가 있습니다.
mkdir my_long_dir
cd $_
당신이 추측한/희망한 대로 하십시오. 명령줄에 있을 때 반복할 필요가 없도록 간단한 자리 표시자를 제공하세요.
¹ 최소한 여기에는 간단한 디렉토리 이름이 있으며 $CDPATH
비어 있거나 설정되지 않았으며 $IFS
기본값이 수정되지 않았다고 가정합니다. 일반적인 경우에는 비슷한 것을 원 mkdir -p -- $'-less tamed directory-/../foo/ *** Ah! *** /\n\n' && CDPATH= cd -P -- "$_"
하지만 이는 이 논의와 직교합니다.