命令在 bash shell 中有效,但在别名中无效

命令在 bash shell 中有效,但在别名中无效

我正在运行这样的命令:

submit -n 72 -x '--mail-type=END -N2'

这个命令有效。但是,当我将其设置为别名时:

alias foo='submit -n 72 -x '--mail-type=END -N2''

它失败并出现错误:

bash: alias: -N2: not found

然而,这个别名工作得很好:

alias foo='submit -n 72 -x '-N2''

因此,关于 --mail-type=END 片段的一些具体内容会导致问题。

编辑:将 alias='... 更改为 alias foo='...

答案1

报价已关闭。相反,尝试使用""to contains ''(尽管""interpolates $variables,您可能想要也可能不想要)

alias="submit -n 72 -x '--mail-type=END -N2'"

或者使用'\''技巧“结束当前单引号,插入文字引号,重新启动当前单引号”。也就是说,任何内部'都被替换为'\''

alias='submit -n 72 -x '\''--mail-type=END -N2'\'''

以下是我验证引用是否产生单个完整字符串而不是像您的那样产生两个单词的方法:

# not ok, two distinct words
$ perl -E 'say for @ARGV' 'submit -n 72 -x '--mail-type=END -N2''
submit -n 72 -x --mail-type=END
-N2

# ok, a single string
$ perl -E 'say for @ARGV' 'submit -n 72 -x '-N2''                
submit -n 72 -x -N2
$ 

# ok, single quotes within doubles
$ perl -E 'say for @ARGV' "submit -n 72 -x '--mail-type=END -N2'"
submit -n 72 -x '--mail-type=END -N2'

# ok, '\'' trick
$ perl -E 'say for @ARGV' 'submit -n 72 -x '\''--mail-type=END -N2'\'''
submit -n 72 -x '--mail-type=END -N2'
$ 

至于foo='submit -n 72 -x '-N2'',那就是不是嵌套; UNIX 上的引用不要嵌套,这就是为什么 shell$(cmd ... $(cmd ...))不试图找出如何仅使用反引号来嵌套的原因。foo='submit -n 72 -x '-N2''是一种更冗长和复杂的说法,foo='submit -n 72 -x '-N2甚至更简单foo='submit -n 72 -x -N2'

答案2

您不能嵌套引号。一个简单的解决方法是使用不同的引号:

alias foo='submit -n 72 -x "--mail-type=END -N2"'

更好的解决方法是不使用别名。使用函数代替。

foo () {
    submit -n 72 -x '--mail-type=END -N2' "$@"
}

相关内容