1. 쉘이 시작되면,

1. 쉘이 시작되면,

$_Bash 매뉴얼의 다음 문장 , 특히 굵은 부분을 설명해 주시겠습니까 ? 몇 가지 예를 들어 주시겠습니까?

  1. 쉘이 시작되면 쉘 또는 실행 중인 쉘 스크립트를 호출하는 데 사용되는 절대 경로 이름으로 설정하십시오.환경 또는 매개변수 목록 전달.

  2. 그후, 이전 명령의 마지막 매개변수로 확장됩니다.

  3. 또한 전체 경로 이름으로 설정됩니다.실행된 각 명령을 호출하는 데 사용됩니다.그리고명령으로 내보낸 환경에 배치됨.

  4. 언제이메일 확인 중, 이 매개변수는 메일 파일의 이름을 저장합니다.

답변1

나는 그것이 명확하지 않다는 데 동의합니다.

1. 쉘이 시작되면,

  • 변수가 수신된 _환경 에 있는 경우bash, bash변경되지 않은 상태로 유지됩니다.

    특히, 쉘이 bash다른 쉘에 의해 호출되는 경우(일부 구현에서는 그렇습니다) 쉘은 환경 변수를 실행 중인 명령의 경로로 설정합니다(질문의 세 번째 요점). 예를 들어, 다른 쉘 해석의 결과로 스크립트를 해석하기 위해 if를 호출하면 다음과 같습니다.bashzshyashkshbash_bashbash

    bash-script some args
    

    이는 스크립트를 해석하는 셸 변수의 초기 값인 환경으로 bash전달됩니다 ._=/path/to/bash-scripbash-script$_ bashbash

    $ 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_다른 쉘과 마찬가지로 시스템 호출의 첫 번째 인수로 사용되는 경로를 포함하는 환경 변수를 실행하는 명령에 전달합니다 .bashexecve()

$ 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 -- "$_"하지만 이는 이 논의와 직교합니다.

관련 정보