在 bash cli 中创建一个昵称来替换不带 $VARIABLE 的字符串

在 bash cli 中创建一个昵称来替换不带 $VARIABLE 的字符串

是否可以为常用字符串创建昵称,而无需在 $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

没有这样的机制。别名可以做到这一点,但它们不像变量那样工作。变量扩展需要标记为$(这不是很多打字)。

然而,特别是主机名可以通过多种方式使用别名:

  1. 通过/etc/host

    $ip|$target_hostname $hostalias
    
  2. 通过指定的用户级主机文件export HOSTALIASES=$the_hostfile

    $hostalias $ip|$target_hostname
    
  3. 通过dns

  4. 通过您的 ssh 配置文件('~/.ssh/config')(仅限 ssh):

    Host $hostalias
       HostName $target_hostname
    

相关内容