편집: @Kusalananda의 답변 이후 수정된 예입니다. 내 모든 상황은 더 복잡했습니다. 여러 명령과 변수 정의가 필요합니다)
su
루트가 아니고 비밀번호를 입력하고 싶지 않아서 사용할 수 없습니다
동료의 스크립트에서 su 코드를 모방하려고 했습니다.
# script runs as root
su - oracle -- "export DATA=$val; cat <<CHK
test
CHK"
Password:
test
다음은 작동하지 않습니다(오류 출력).
$ export val=534
$ sudo -i -u oracle -- "export DATA=$val;cat <<CHK
test
CHK"
-ksh: export DATA=534;cat <<CHKtestCHK: not found
[127]$
이것은 둘 다 아닙니다(전혀 출력 없음).
$ sudo -i -u oracle -- ksh -c "export DATA=$val;cat <<CHK
test
CHK"
$
sudo
어느 정도 는 이해한다평평한들어가지만,만수도이는 매개변수에서만 언급되고 공백으로 구분되지만 여기서는 그렇지 않습니다.
답변1
실행하는 명령의 일부로 이 문서를 리디렉션할 필요는 없습니다 sudo
.
sudo -u oracle env DATA="$val" cat <<END
this is
the here-document
END
이 sudo
유틸리티는 표준 입력 스트림을 실행하는 명령에 전달합니다. 이 env
도구는 특정 유틸리티를 실행하기 전에 환경을 수정합니다. 위에 표시된 대로 이를 사용하면 대부분의 변수에 대한 환경이 지워지 더라도 sudo
실행하려는 유틸리티에서 환경 변수를 설정하는 방법입니다 .sudo
sudo
명령이 변수를 설정하고 실행하는 것보다 더 복잡한 경우 스크립트에서 수행해야 하는 작업을 cat
수집한 다음 스크립트를 실행하는 것이 좋습니다 .sudo
#!/bin/sh
export DATA="something"
cat <<END
this is
the here-document
END
이 문자열은 something
스크립트의 명령줄에서도 얻을 수 있습니다. 또는 명령문을 완전히 생략하고 대신 스크립트를 실행할 때 이전에 표시된 대로 설정할 수 있습니다 DATA
.env
sudo env DATA="$var" ./myscript