sudo -u db2inst -sh "db2"를 실행할 때 올바른 $PATH를 얻을 수 있습니까?

sudo -u db2inst -sh "db2"를 실행할 때 올바른 $PATH를 얻을 수 있습니까?

실행해야 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

관련 정보