[bash] 파이프의 두 번째 명령에 대해 Bash의 명령 전에 환경 변수 설정이 작동하지 않습니다

주어진 쉘에서 일반적으로 변수 또는 변수를 설정하고 명령을 실행합니다. 최근에 변수 정의를 명령 앞에 추가하는 개념에 대해 배웠습니다.

FOO=bar somecommand someargs

이것은 작동합니다 … LC_ * 변수를 변경하거나 ( 예 : ‘[az]’char 범위와 같은 인수에는 영향을 미치지 않는 것처럼 보이는) LC_ * 변수를 변경 하거나 출력을 다른 명령으로 파이핑 할 때 작동 하지 않습니다 .

FOO=bar somecommand someargs | somecommand2  # somecommand2 is unaware of FOO

“FOO = bar”를 사용하여 somecommand2를 앞에 추가 할 수도 있는데, 이는 작동하지만 원치 않는 중복을 추가하며 변수에 따라 해석되는 인수 (예 : ‘[az]’)에는 도움이되지 않습니다.

그렇다면 한 줄 로이 작업을 수행하는 좋은 방법은 무엇입니까?

나는 순서대로 뭔가를 생각하고있다.

FOO=bar (somecommand someargs | somecommand2)  # Doesn't actually work

나는 좋은 답변을 많이 받았습니다! 목표는 이것을 “내보내기”를 사용하지 않고 하나의 라이너로 유지하는 것입니다. Bash 호출을 사용하는 방법은 전체적으로 가장 좋았지 만 “내보내기”가 포함 된 괄호 버전은 조금 더 콤팩트했습니다. 파이프 대신 리디렉션을 사용하는 방법도 흥미 롭습니다.



답변

FOO=bar bash -c 'somecommand someargs | somecommand2'


답변

변수를 내보내고 서브 쉘에서만 내보내는 것은 어떻습니까? :

(export FOO=bar && somecommand someargs | somecommand2)

Keith는 명령을 무조건 실행하려면 다음과 같이하십시오.

(export FOO=bar; somecommand someargs | somecommand2)


답변

당신은 또한 사용할 수 있습니다 eval:

FOO=bar eval 'somecommand someargs | somecommand2'

이 답변은 eval모든 사람을 기쁘게하는 것 같지 않으므로 무언가를 명확히하겠습니다 . 작은 따옴표와 함께 서면으로 사용될 때 완벽하게 안전합니다. 허용되는 답변과 같은 외부 프로세스를 시작하지 않거나 다른 답변과 같은 추가 하위 쉘에서 명령을 실행하지 않기 때문에 좋습니다.

우리가 몇 가지 정기적 인 견해를 얻었을 때, eval모든 사람들을 기쁘게 할 대안을 제공하는 것이 좋으며 ,이 빠른 eval“속임수”의 모든 이점 (그리고 아마도 더 많은 것)이 있습니다. 그냥 기능을 사용하십시오! 모든 명령으로 함수를 정의하십시오.

mypipe() {
    somecommand someargs | somecommand2
}

다음과 같이 환경 변수로 실행하십시오.

FOO=bar mypipe


답변

사용하십시오 env.

예를 들면 다음과 같습니다 env FOO=BAR command. 다음과 같은 경우 환경 변수가 다시 복원 / 변경되지 않습니다.command 실행이 끝나면 .

쉘 대체가 일어나지 않도록주의하십시오. 즉 $FOO, 동일한 명령 행에서 명시 적으로 참조하려는 경우 쉘 인터프리터가 실행 전에 대체 수행하지 않도록이를 벗어나야 할 수도 있습니다 env.

$ export FOO=BAR
$ env FOO=FUBAR bash -c 'echo $FOO'
FUBAR
$ echo $FOO
BAR


답변

쉘 스크립트를 사용하십시오.

#!/bin/bash
# myscript
FOO=bar
somecommand someargs | somecommand2

> ./myscript


답변