是否可以为常用字符串创建昵称,而无需在 $variables 前面使用“$”?
该字符串可以是固定的,并且在 shell 提示符的生命周期内不需要更改。
我知道有 bash $variables,但我正在寻找一种解决方案,而无需在 $variables 前面使用“$”,因此输入速度更快。
我知道有别名可以缩短整个命令,但我不想缩短命令,我只想缩短命令的一部分。
例如,我想替换这个:
$ ssh remote_server_1
$ scp remote_server_1
$ my_script.sh remote_server_1
$ ssh remote_server_2
$ scp remote_server_2
$ my_script.sh remote_server_2
有了这个:
$ aliasthingy r1="remote_server_1"
$ aliasthingy r2="remote_server_2"
$ ssh r1
$ scp r1
$ my_script.sh r1
$ another_script.sh r1
$ ssh r2
$ scp r2
$ my_script.sh r2
$ another_script.sh r2
不这样做:
$ export r1="build_server_r1"
$ export r2="build_server_r2"
$ ssh $r1
$ scp $r1
$ my_script.sh $r1
$ another_script.sh $r1
$ ssh $r2
$ scp $r2
$ my_script.sh $r2
$ another_script.sh $r2
原因是,在每个 r1 r2 前面不加“$”比在 $r1 $r2 前面键入要快,所以如果我可以删除“$”那就太好了
答案1
对于 SSH 的特定用例,别名为~/.ssh/config
是要走的路。这是 SSH 的主机参数和一组选项的缩写方式。它们不仅不需要前面的$
,而且不会在不调用通过 SSH 访问的主机名的上下文中使用,并且它们将在调用通过 SSH 访问的主机名的其他上下文中使用,例如 SSHFS, rsync等
Host r1
HostName remote_server_1
UserName vassilis
Host r2
HostName remote_server_2
UserName vp
Host r2test
HostName remote_server_2
UserName guest
对于实际需要命令行别名的其他用例,zsh 有全局别名,定义为alias -g
。 Bash 没有这样的东西。
alias -g r1=remote_server_1
ssh r1
全局别名的主要问题是它们会在任何地方触发,即使它们没有意义。
% echo r1
remote_server_1
但如果它们是单词的一部分,它们就不会触发,所以scp r1:/some/path .
不起作用。
如果您希望某些东西可以在 shell 命令行的任何位置工作,请定义一个变量,然后键入$
.如果在键盘上打字确实很困难,您可以将其映射到更易于使用的按键。例如,要M-v
插入 a $
,请将其放入您的.bashrc
:
readline_insert () {
READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${1}${READLINE_LINE:$READLINE_POINT:}"
((READLINE_POINT += ${#1}))
}
bind -x '\ev: readline_insert \$'
答案2
好吧,在您的示例的特定情况下,您要存储的值是主机名,是的,您可以。只需编辑您的/etc/hosts
文件并添加以下行:
build_server_r1 r1
build_server_r2 r2
您现在可以运行:
ssh r1
scp r1:/path/to/file .
是否my_script.sh r1
有效取决于您的脚本。如果您尝试连接到服务器,它可能会起作用。如果您需要r1
扩展到 string remote_server_1
,则不会。
答案3
没有这样的机制。别名可以做到这一点,但它们不像变量那样工作。变量扩展需要标记为$
(这不是很多打字)。
然而,特别是主机名可以通过多种方式使用别名:
通过
/etc/host
$ip|$target_hostname $hostalias
通过指定的用户级主机文件
export HOSTALIASES=$the_hostfile
$hostalias $ip|$target_hostname
通过
dns
通过您的 ssh 配置文件('~/.ssh/config')(仅限 ssh):
Host $hostalias HostName $target_hostname