带 EOF 的 SSH 正确设置了 $PATH,但为什么没有 EOF 就不能工作?
SSH with EOF correctly sets $PATH, but why doesn't it work without EOF?
我想了解为什么 ssh 不将 $PATH 设置为 .profile 中确定的任何内容,但似乎在 ssh 使用 EOF 时设置。
我想 运行 我的脚本中的这一行:
DIR_EXPANDED=`ssh $TOADDRESS "$(typeset -f get_dir); get_dir $DIR $DBNAME"`
其中 get_dir
定义如下:
function get_dir() {
DIRECTORY_NAME=
DBNAME=
if [ -z "$DIRECTORY_NAME" ]; then
echo "Enter Directory Name:"; read DIRECTORY_NAME
elif [ -n "" ]; 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 时路径设置不正确,如下所示:
ssh $TOADDRESS 'echo $PATH'
/usr/local/bin:/usr/bin
通过反复试验,我发现这行得通:
TODIR_EXPANDED=`ssh $TOADDRESS << EOF
$(typeset -f get_dir); get_dir $TODIR $TODBNAME
EOF`
谁能解释一下为什么 ssh 是这样工作的?以及 how/if 是否可以使用我首先描述的单线?
如果您使用 ssh HOST command
,将加载非交互式 shell,它不会读取 .profile
登录 shell 或 .kshrc
用于交互式 shells.
如果您使用 ssh HOST
,它会启动一个交互式 shell(尽管没有分配伪 TTY)并读取 .kshrc
(或类似的,取决于实际的 shell 生成),然后继续从标准输入读取命令。
所以,如果你想让这些功能可用,你可以这样做:
DIR_EXPANDED=$(ssh $TOADDRESS ". ./.kshrc; $(typeset -f get_dir); get_dir $DIR $DBNAME")
(我还将不推荐使用的命令替换形式(使用重音符号)更改为 modern/POSIX 形式,因为这修复了一些错误。)
我想了解为什么 ssh 不将 $PATH 设置为 .profile 中确定的任何内容,但似乎在 ssh 使用 EOF 时设置。
我想 运行 我的脚本中的这一行:
DIR_EXPANDED=`ssh $TOADDRESS "$(typeset -f get_dir); get_dir $DIR $DBNAME"`
其中 get_dir
定义如下:
function get_dir() {
DIRECTORY_NAME=
DBNAME=
if [ -z "$DIRECTORY_NAME" ]; then
echo "Enter Directory Name:"; read DIRECTORY_NAME
elif [ -n "" ]; 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 时路径设置不正确,如下所示:
ssh $TOADDRESS 'echo $PATH'
/usr/local/bin:/usr/bin
通过反复试验,我发现这行得通:
TODIR_EXPANDED=`ssh $TOADDRESS << EOF
$(typeset -f get_dir); get_dir $TODIR $TODBNAME
EOF`
谁能解释一下为什么 ssh 是这样工作的?以及 how/if 是否可以使用我首先描述的单线?
如果您使用 ssh HOST command
,将加载非交互式 shell,它不会读取 .profile
登录 shell 或 .kshrc
用于交互式 shells.
如果您使用 ssh HOST
,它会启动一个交互式 shell(尽管没有分配伪 TTY)并读取 .kshrc
(或类似的,取决于实际的 shell 生成),然后继续从标准输入读取命令。
所以,如果你想让这些功能可用,你可以这样做:
DIR_EXPANDED=$(ssh $TOADDRESS ". ./.kshrc; $(typeset -f get_dir); get_dir $DIR $DBNAME")
(我还将不推荐使用的命令替换形式(使用重音符号)更改为 modern/POSIX 形式,因为这修复了一些错误。)