배쉬 매뉴얼에서
_
쉘이 시작되면 환경 또는 인수 목록에 전달된 쉘을 호출하는 데 사용되는 절대 경로 이름이나 실행 중인 쉘 스크립트로 설정하십시오. 그런 다음 확장 후 이전 명령의 마지막 인수로 확장됩니다.또한 실행된 각 명령을 호출하고 해당 명령으로 내보낸 환경에 배치하는 데 사용되는 전체 경로 이름으로 설정됩니다.메일을 확인할 때 이 매개변수는 메일 파일의 이름을 보유합니다.
굵은 글씨의 경우,스티븐 라고
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
. 단, 프로세스가 계속 실행 중이고 권한이 있는 경우에만 가능합니다.
env
printenv
변수가 줄 바꿈 대신 널 문자로 구분된다는 점을 제외하면 내용은 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
. ..