実行する必要が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