sudo -u db2inst -sh "db2"を実行すると正しい$ PATHを取得できますか?

sudo -u db2inst -sh

実行する必要がsudo -u db2inst1 sh -c "db2 connect to db; db2 set schema Edumate; db2 \"select * from edumate_settings\""ありますが、db2への絶対パスを指定したくありません。

走ればsudo -u db2inst1 sh -c "id;$PATH;ls /opt/ibm/db2/V9.7/bin/db2"

/opt/ibm/db2/V9.7/bin/$PATHが存在する正しい場所を取得しました。

uid=1002(db2inst1) gid=107(db2iadm1) groups=16(dialout),33(video),107(db2iadm1),108(db2fadm1),1001(eduserver)
sh: /sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/usr/lib64/jvm/jre/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin:/opt/firebird/bin:/opt/ibm/db2/V9.7/bin/:/opt/eduserver/bin: No such file or directory
/opt/ibm/db2/V9.7/bin/db2

しかし、私がsudo -u db2inst1 sh -c "db2"走ったらsh: db2: command not found

絶対パスを使用している場合(変更された場合は絶対パスを使用したくありません)、db2プロンプトが表示されます。

db2このコマンドでのみ呼び出す方法に関する提案sudo -u db2inst1 sh -c "db2 connect to db; db2 set schema Edumate; db2 \"select * from edumate_settings\""

ベストアンサー1

ほとんどの構成では、sudoはPATH環境変数をコンパイル時のデフォルト値または/etc/sudoers

コマンドをに渡す前にパスルックアップを実行できますsudo

db2=$(unset -f db2; unalias db2 2>/dev/null; command -v db2)
sudo -u db2inst1 sh -c '"$0" connect to db; "$0" set …' "$db2"

通常、コマンドが現在のシェルの関数でもエイリアスでもなく、フルパスに特殊文字が含まれていないことがわかっている場合:

sudo -u db2inst1 sh -c "$(command -v db2) connect to db; $(command -v db2) set …"

$(command -v db2)シェルで評価できるように、ここでは二重引用符を使用します。より多くの入力を保存するために、標準入力にコマンドを提供できます。

sudo -u db2inst1 $(command -v db2) <<\EOF
connect to db
set …
EOF

おすすめ記事