我想了解为什么ssh没有将$ PATH设置为.profile中确定的任何内容,但是当ssh使用EOF时似乎这样做。
我想在我的脚本中运行这一行:
DIR_EXPANDED=`ssh $TOADDRESS "$(typeset -f get_dir); get_dir $DIR $DBNAME"`
其中get_dir
的定义如下:
function get_dir() {
DIRECTORY_NAME=$1
DBNAME=$2
if [ -z "$DIRECTORY_NAME" ]; then
echo "Enter Directory Name:"; read DIRECTORY_NAME
elif [ -n "$2" ]; then
. oraenv $DBNAME
fi
DIRECTORY=`sqlplus -s '/ as sysdba' << EOF
set pages 0 head off feed off
select directory_path from all_directories where directory_name='$DIRECTORY_NAME';
EOF`
echo $DIRECTORY;
}
但是,运行脚本会导致错误
ksh[10]: .: oraenv: cannot open [No such file or directory]
我发现这是因为ssh'ing时路径没有正确设置,如下所示:
ssh $TOADDRESS 'echo $PATH'
/usr/local/bin:/usr/bin
通过反复试验,我发现这有效:
TODIR_EXPANDED=`ssh $TOADDRESS << EOF
$(typeset -f get_dir); get_dir $TODIR $TODBNAME
EOF`
有人可以解释为什么ssh这样工作?以及如何/如果可以使用我首先描述的单线程?
如果使用ssh HOST command
,则会加载一个非交互式shell,它不会读取登录shell的.profile
或交互式shell的.kshrc
。
如果你使用ssh HOST
它会启动一个交互式shell(尽管没有分配伪TTY)并读取.kshrc
(或类似的,取决于产生的实际shell),然后继续从标准输入读取命令。
因此,如果您希望使这些功能可用,您可以这样做:
DIR_EXPANDED=$(ssh $TOADDRESS ". ./.kshrc; $(typeset -f get_dir); get_dir $DIR $DBNAME")
(我还将已弃用的命令替换形式(使用重音符号)更改为现代/ POSIX格式,因为这修复了一些错误。)