我的 Bash 别名无法通过 ssh 运行,例如:
$ ssh remote_name ll dir_name
bash: ll: command not found
Bash 手册页显示:
Aliases are not expanded when the shell is not interactive,
unless the expand_aliases shell option is set using shopt...
所以我在本地和远程文件的文件shopt -s expand_aliases
顶部添加了(因为我不确定需要哪个 - 远程对吧??)。~/.bashrc
.bashrc
我重新启动本地 Bash 并ssh remote_name ll dir_name
再次尝试,不幸的是我仍然遇到同样的错误bash: ll: command not found
。
谁能解释一下我应该做什么才能让它正常工作?
以防万一我的 Bash 版本是:
Local Bash:
$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Remote Bash:
$ bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
答案1
~/.bashrc
由 的非登录交互式会话读取bash
,而不是由非交互式会话读取。
ssh remote some_command
some_command
在 的非交互式会话中运行bash
,因此不会读取远程数据~/.bashrc
(当然读取本地数据也是不可能的)。
准确地说,非交互式会话可以读取环境变量或(如果设置)bash
定义的文件。BASH_ENV
ENV
如果您想坚持使用别名,也可以以交互模式打开 shell:
ssh remote bash -ic 'll'
另请注意,别名是独立的,它们不接受任何参数,就像您提供目录名称一样。您需要使用函数将参数作为输入。类似的函数定义是:
ll_f () { ls -al --color=auto "$@" ;}
现在你可以这样做:
ll_f /dir_name
答案2
我最喜欢的方式(在~/.bashrc
):
function bassh() {
local host=${1:?'arg #1 missing: remote host'}
shift
local command="$@"
local usage="bassh REMOTE_HOST COMMAND"
[ "$command" ] || {
echo -e >&2 "[error] no command provided\nUsage: ${usage}"
return 1
}
ssh ${host} -t bash -ic "'${command}'"
}
请注意-t
ssh 的选项,该选项强制伪终端分配,从而避免相关警告。
然后你简单地称呼它:
$ bassh REMOTE_HOST ll
答案3
使用
#!/bin/bash -l
它解决了问题