서브쉘을 "프로그램"으로 만드는 방법

서브쉘을 "프로그램"으로 만드는 방법

다음과 같이 기존의 모든 환경 변수를 무시하고 하나만 에코하고 싶습니다.

env -i <(
   export foo=bar; 
   env
)

그러면 다음과 같이 인쇄됩니다.

foo=bar

그러나 건설

env -i <()

내 직감이 작동해야 한다고 말하지만 작동하지 않는 것 같습니다. env -i를 실행할 인라인 프로그램을 여기서 어떻게 만들 수 있습니까?

답변1

env에 실제 프로그램을 제공하십시오.

env -i bash -c '
   export foo=bar
   env
'

이는 $PATH환경 변수 도 제거하므로 bash시스템의 기본 명령 검색 경로에 없으면 작동하지 않습니다.

bash통역사를 전달하기 전에 통역사의 경로를 찾아볼 수 있습니다 env.

env -i -- "$(command -v bash)" -c '
   export foo=bar
   env
'

시작하는 쉘에서 bash명령을 찾는 데 동일한 문제가 있을 수 있습니다 env.

답변2

모든 변수를 내보내지 않은 상태로 서브셸에서 명령을 실행하는 것이 요점이라면 zsh에서 다음을 수행할 수 있습니다.

(
  typeset +x -m '*'
  those-commands
)

다른 많은 쉘과 마찬가지로 zsh는 자동으로 _환경 변수와 실행되는 파일의 경로를 실행하는 명령에 대한 값으로 전달합니다.

이 플래그를 사용하면 쉘 변수 typeset +x -m '*'만 내보내지지 않습니다 . xzsh가 시작 시 수신하고 쉘 변수(예: 일부 명명된 123, 개행 또는 ***...)에 매핑할 수 없는 환경 변수 또는 zsh가 환경에서 가져오지 않는 환경 변수(예: $IFS, $USERNAME)는 명령에서 여전히 동일합니다. 환경을 실행합니다.

$ env '123=x' '***=bar' 'IFS=xyz' zsh
$ (typeset +x -m '*'; env)
_=/usr/bin/env
IFS=xyz
123=x
***=bar

관련 정보