bash
我的 bash 配置文件中有一个特定的代码:
$ cat ~/.bash_profile
#!/usr/bin/env bash
echo "SHELL: $SHELL"
function printfiles() {
while IFS='' read -r _file || [[ -n "$_file" ]]; do
echo "file: ${_file}"
done < <(ls)
} && export -f printfiles
这< <(FUNCTION)
是bash
特定语法,不支持sh
。当我使用 ssh 登录到远程计算机时:
$ ssh my.remote
[email protected]'s password:
Last login: Fri Nov 17 11:27:39 2017 from yyy.yy.yy.yy
sourcing /home/me/.bash_profile
SHELL: /bin/bash
一切正常。现在我想再次登录,但转发我的X11
:
$ ssh -X my.remote
[email protected]'s password:
sh: printfiles: line 2: syntax error near unexpected token `<'
sh: printfiles: line 2: ` done < <(ls)'
sh: error importing function definition for `printfiles'
sh: printfiles: line 2: syntax error near unexpected token `<'
sh: printfiles: line 2: ` done < <(ls)'
sh: error importing function definition for `printfiles'
sh: printfiles: line 2: syntax error near unexpected token `<'
sh: printfiles: line 2: ` done < <(ls)'
sh: error importing function definition for `printfiles'
sh: printfiles: line 2: syntax error near unexpected token `<'
sh: printfiles: line 2: ` done < <(ls)'
sh: error importing function definition for `printfiles'
Last login: Fri Nov 17 11:28:51 2017 from yyy.yy.yy.yy
sourcing /home/me/.bash_profile
SHELL: /bin/bash
我不知道发生了什么,似乎当我进行 X11 转发时,sh
shell 以某种方式被使用bash
。为什么会这样,如何解决?
答案1
如果我发现 -X 和 -x 登录之间存在不一致,我怀疑:
- .bash_profile/.profile 和 .bashrc 之间的区别 - 请参阅https://serverfault.com/a/261807/116193
- 本地环境与远程环境的交互 - 我通过剥离对本地环境的控制来进行调试,例如
env -i ssh ...
另外:一般来说,我喜欢使用 -x 来排除许多此类故障。您可能能够在服务器端配置 Shell,以在登录时启用跟踪 (-x)。
如果我想到其他的,我会更新。