带有外壳扩展的多行别名挂起另一个参数



Hel‌瞧!在我开始之前,我的问题不是重复的:https://askubuntu.com/questions/1071263/multi-line-alias-in-bash或者这样:bash的别名中有多个命令。我把答案读得很透彻。

我的问题是,当我在多行别名中分配变量时,会出现错误,导致shell等待另一个参数。

这是一个工作别名:

$ alias alias1='var1="$(date)" ; echo $var1'
Wed Jul 28 18:07:37 +0230 2021

但如果我用多行写它,shell会等待另一个参数:

$ alias alias1='var1="$(date)"
> echo $var1'
$ alias1
$ hello
Wed Jul 28 18:10:28 +0230 2021 hello

我知道date有问题,但我不明白发生了什么。

我试着把;放在第一行的末尾,它没有解决问题,但我放了&&,它解决了问题,也解决了这个问题,这对我来说很奇怪,因为用于行的延续:

$ alias alias1='var1="$(date)"  
echo $var1'
$ alias1
Wed Jul 28 18:12:47 +0230 2021

提前谢谢。

到目前为止,有一件事从未让我失望过,那就是大括号。

alias alias1='{ var1="$(date)"
echo $var1; }'

请确保在左大括号之后和右大括号之前添加一个空格字符。如果右大括号的同一行有一个命令,请确保添加如上所示的;

如果你想这样做的话,你可以使用换行符来摆脱丑陋的;

alias alias1='{
var1="$(date)"
echo $var1
}'

你可以用括号()做同样的事情,实际上语法更宽容,例如,你不需要额外的空格字符,也不需要最后的分号,但你不能访问你在别名中分配的变量。

alias alias1='(var1="$(date)"
echo $var1)'

TL;DR:如果您想在调用别名后访问变量,请使用大括号,否则请使用括号以防止变量泄露

旁注

我还没有找到解释它为什么会这样的来源,但多行别名可能会因系统而异。在您的情况下,它似乎在等待用户输入。我有一个可以工作但也显示提示字符串的CentOS发行版:

[user@localhost tmp]$ alias alias1='var1="$(date)"
> echo $var1'
[user@localhost tmp]$ alias1
Wed Jul 28 18:09:32 CEST 2021 date printf 33]0;%s@%s:%s07 user localhost /tmp

在MobaXterm中嵌入的Cygwin上,它只是什么都不显示。

底线:使用多行别名的风险自负。

相关内容

  • 没有找到相关文章