我知道我可以通过 SSH 在远程服务器上执行一个函数,如下所示:
$ ssh remote_server "$(declare -f cool_function); cool_function"
我还有一些别名,我想在远程服务器上执行它们,而不必在远程服务器上的任何文件上定义它们,这样我就可以将所有函数和别名放在一个地方并在任何远程 SSH 服务器上使用它们。
我认为这会起作用:
$ alias very_cool_alias='echo A very cool alias'
$ very_cool_alias
A very cool alias
$ ssh remote_server "$(alias very_cool_alias);very_cool_alias"
bash: very_cool_alias: command not found
尽管如果我检查别名,别名就在那里:
$ ssh remote_server "$(alias very_cool_alias);alias"
alias very_cool_alias='echo A very cool alias'
为什么函数有效但别名无效,尽管如最后一个例子所证明的那样,它已传递给远程 SSH 服务器?你知道我遗漏了什么吗?或者我该如何实现这一点?
我也尝试设置 expand_aliases 选项但仍然得到command not found
:
ssh remote_server "shopt -s expand_aliases;$(alias some_alias);some_alias"
答案1
外壳手册 告诉我们:
当 shell 不是交互式的时,别名不会展开,除非使用 expand_aliases shell 选项设置
shopt
...
然而它也提到
有关别名的定义和使用的规则有些令人困惑。Bash 总是先读取至少一整行输入,然后再执行该行上的任何命令。别名是在读取命令时展开的,而不是在执行命令时展开的。
这可以在本地进行测试:(ssh 正在bash -c
远程调用):
$ bash -c "shopt -s expand_aliases; shopt expand_aliases;alias x=ls; x"
expand_aliases on
bash: x: command not found
它确实有助于使其成为多行:
$ bash -c "shopt -s expand_aliases; alias x='echo y'
> x"
y
这也适用于 ssh。
答案2
您可能应该同步包含您喜欢的别名的 .profile、.bash_profile 和/或 .bashrc 文件。为了方便起见,我建议使用 rsync。