프로그램/스크립트의 출력이 특히 bash 스크립트에서 eval로 전달되는지 확인하려고 합니다.
예를 들어 다음을 구별할 수 있습니다.
$ ./program.sh
~에서
$ eval "$(./program.sh)"
program.sh 내에서? 후자는 평가할 환경 변수를 인쇄하지만 첫 번째는 그렇지 않습니다.
./program.sh print-env
이렇게 하면 평가판에 전달하기 위한 프로그램을 개발하지 않아도 됩니다 .
반면에 이런 가능성이 있으면 eval
Idea?에 전달된 출력을 작성하는 것이 가능하다는 것을 알 수 있습니다.
답변1
존재하다:
eval "$(./program.sh)"
셸은 ./program.sh
파이프로 리디렉션된 표준 출력으로 실행되고 파이프의 다른 쪽 끝에 있는 메모리의 출력을 읽습니다. 그런 다음 일단 ./program/sh
사라지면(해당 파이프에 eof가 표시되고 이후에 wait()
프로세스를 완료하기 위해 대부분의 쉘에서 반환됨) 저장된 내용에서 후행 개행 문자를 뺀 내용이 eval
.
따라서 이러한 상황을 감지하려면 ./program.sh
다음이 필요합니다.
- 표준 출력이 파이프임을 감지합니다. 그것은 간단합니다. 리눅스에서는 를 사용할 수 있습니다
[ -p /dev/stdout ]
. - 이는 파이프의 반대쪽 끝에서 데이터를 읽는 쉘 프로세스입니다. 이것은 더욱 복잡해집니다. 최근 Linux에서는 10보다 큰 fd를 읽기 위해 파이프를 연 이름 이 로 끝나는 프로세스
lsof
의 출력을 볼 수 있습니다 .lsof +E -Fca -ap "$$" -d 1
sh
eval something
그런 다음 셸 프로세스가 현재 명령줄을 해석하고 있는지 확인해야 합니다 . 이렇게 하려면 디버거를 셸에 연결하고 해당 특정 셸의 내부 데이터 구조를 이해하여 실제로 어떤 명령이 실행되었는지 확인해야 할 수 있습니다.
간단히 말해서, 당신은 할 수 없습니다. 그러나 출력이 tty로 갈 때와 그렇지 않을 때 다른 출력을 제공하는 것으로 만족할 수도 있으며 이는 문제가 될 수 있습니다.
if [ -t 1 ]; then
echo output for tty
else
echo output for something else
fi