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