oracle - 带有 EOF 的 SSH 正确设置了 $PATH,但是为什么没有 EOF 就不能工作?
问题描述
我想了解为什么 ssh 不会将 $PATH 设置为 .profile 中确定的任何内容,但似乎在 ssh 使用 EOF 时会这样做。
我想在我的脚本中运行这一行:
DIR_EXPANDED=`ssh $TOADDRESS "$(typeset -f get_dir); get_dir $DIR $DBNAME"`
whereget_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,它不会读取.profile
登录 shell 或.kshrc
交互式 shell。
如果你使用ssh HOST
它启动一个交互式 shell(尽管没有分配伪 TTY)并读取.kshrc
(或类似的,取决于生成的实际 shell),然后继续从标准输入读取命令。
所以,如果你想让这些功能可用,你可以这样做:
DIR_EXPANDED=$(ssh $TOADDRESS ". ./.kshrc; $(typeset -f get_dir); get_dir $DIR $DBNAME")
(我还将命令替换的弃用形式(使用重音符号)更改为现代/POSIX 形式,因为这修复了一些错误。)
推荐阅读
- c - 使用 C 套接字创建服务器并出现错误
- python - Pandas 自定义 Groupby 占总数的百分比
- python - Numpy数组:每行的乘法数组
- r - R - 按顺序排列数据框,如果变量保持不变则重复值,并在它改变时改变它
- html - 卡在媒体查询中,我无法修复它
- r - 在嵌套函数中使用相同的参数名称会导致意外输出
- cygwin - 如何删除cygwin挂载点
- python - 沿轴使用给定索引对多维 np.array 进行排序
- r - 使用 ggplot 在一个图中为具有不同标签的分组数据绘制两条线图
- javascript - Firebase 的 https 函数中可以使用通配符吗?或者如何在没有它的情况下复制数据库中的每个文档?