명령에 전달된 환경 변수로 `_`를 사용합니다.

명령에 전달된 환경 변수로 `_`를 사용합니다.

배쉬 매뉴얼에서

_

쉘이 시작되면 환경 또는 인수 목록에 전달된 쉘을 호출하는 데 사용되는 절대 경로 이름이나 실행 중인 쉘 스크립트로 설정하십시오. 그런 다음 확장 후 이전 명령의 마지막 인수로 확장됩니다.또한 실행된 각 명령을 호출하고 해당 명령으로 내보낸 환경에 배치하는 데 사용되는 전체 경로 이름으로 설정됩니다.메일을 확인할 때 이 매개변수는 메일 파일의 이름을 보유합니다.

굵은 글씨의 경우,스티븐 라고

bash는 다른 쉘과 마찬가지로 _실행하는 명령에 환경 변수를 전달합니다. 여기에는 bash가 시스템 호출의 첫 번째 인수로 사용하는 경로가 포함됩니다 execve().

$ env | grep '^_'
_=/usr/bin/env

_임의의 명령에 대한 환경 변수 값을 가져오고 env그 값이 해당 명령의 실행 파일이나 스크립트의 경로 이름인지 확인하려면 어떻게 해야 합니까 ?

감사해요.

답변1

$_값은 하위 프로세스에 표시됩니다. 자녀에게 책을 읽게 하는 방법은 사용하는 언어에 따라 다릅니다.

예를 들어 C 언어에서

#include <stdlib.h>
#include <stdio.h>

main()
{
  char *x=getenv("_");
  printf("%s\n",x);
}

$_그러나 다른 쉘이 다르게 작동할 수 있으므로 프로그램은 설정에 의존할 수 없습니다 .

예를 들어

$ env -i /bin/bash -c ./a.out
./a.out

$ env -i /bin/ksh -c ./a.out 
*31801*./a.out

$ env -i /bin/sh -c ./a.out 
Segmentation fault (core dumped)

/bin/sh(이 우분투 시스템의 "대시")에는 $_가 전혀 설정되어 있지 않으므로 이 간단한 프로그램이 충돌합니다. 이런:-)

$_호출 프로그램에서는 이 값을 전혀 볼 수 없습니다. 실제로 호출 셸에서는 $_이전 줄의 마지막 인수로 설정됩니다.

$ ls /tmp > /dev/null
$ echo $_
/tmp

$ echo hello
hello
$ echo $_
hello

답변2

Linux 기반 시스템에서 실행 중인 경우 의사 파일을 읽어 프로세스 환경을 확인할 수 있습니다 /proc/[pid]/environ. 단, 프로세스가 계속 실행 중이고 권한이 있는 경우에만 가능합니다.

envprintenv변수가 줄 바꿈 대신 널 문자로 구분된다는 점을 제외하면 내용은 or 의 출력과 유사합니다.

man proc그리고 더 많은 정보를 검색해 보세요 environ.

예를 들어:

$ /bin/sleep 60 &
[1] 25909
$ tr '\0' '\n' < /proc/$!/environ | grep '^_='
_=/bin/sleep
$ 

확장 $!은 최근 백그라운드에 추가된 작업의 PID입니다.

이는 빨리 완료되는 절차의 경우 더욱 어려울 것입니다.

환경 변수 값에 포함된 경우 "\n_="환경의 일부인 줄 바꿈과 null 문자에서 변환된 줄 바꿈을 구별할 수 없기 때문에 거짓 긍정이 발생할 수 있습니다. 이는 문제가 되지 않을 것 같지만 만약 문제가 된다면 다른 조치를 취해야 합니다.

perl -nE 'undef $/; say grep /^_=/, split /\0/, scalar <>' /proc/$!/environ

답변3

이는 불가능합니다(실행 중인 쉘에서는).

환경 변수 값을 인쇄하려면 명령이 필요하며 다음을 사용할 수 있습니다 printenv.

$ printenv "LANG"
LANG=en_US.UTF-8

명령 환경으로 내보낸 변수 값을 보고합니다. 또는 현재 실행 중인 셸에서 echo(또는 printf 또는 print) 변수의 값을 사용할 수 있습니다.

$ echo "$LANG"
LANG=en_US.UTF-8

두 경우 모두 명령이 실행되고 변수 값은 $_실행된 명령의 마지막 인수로 설정됩니다(명령이 실행된 경우).

$ ls
$ echo ".$_."
.--color=auto.
$ echo ".$_."
..--color=auto..
$ echo ".$_."
...--color=auto...

$ bash -c 'echo $_'
/bin/bash

$ bash -c 'ls -l >>/dev/null; echo $_'
-l

따라서 실행된 모든 명령은 명령을 실행한 하위 쉘에 대해 설정된 값을 가지며 $_동일한 쉘에 의해 인쇄됩니다.$_

일부 쉘은 임시를 사용하거나 설정하지 않습니다 $_.

$ dash -c 'ls -l >/dev/null; echo ".$_."'
./bin/dash.

그러나 이것은 그것으로 이어지는 길의 가치를 드러낼 뿐입니다 dash. ..

관련 정보