編集:@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