使用变量在 shell 脚本中创建别名

Create alias in shell script using a variable

我有一个目录“/dir”。在这个目录中,我有名称为 arg1_config.tclarg2_config.tclarg3_config.tcl 的文件。以后可能会有更多具有相同扩展名的文件。在这种情况下,我正在尝试为 arg1、arg2 和 arg3 动态生成别名,下面是我的代码。

foreach i (`ls <path>/dir/*.tcl`)
set app = `echo $i | sed -e 's/.*\///g' | sed 's/_config.tcl//g'`
echo "app is $app" 
alias $app 'run -app $app' # run is an internal script that takes arg1/2/3 as a switch
echo "alias $app 'run -app $app'"
end

当我获取此文件时,它会打印

app is arg1
alias arg1 'run -app arg1'
app is arg2
alias arg2 'run -app arg2'
app is arg3
alias arg3 'run -app arg3'

然而,当我 运行 which arg3 它说别名为 运行 -app $app 并且 app 值在某种程度上总是退出 foreach 循环后的最后一个值,即在这种情况下为 arg3 .我无法像上面的打印消息那样创建别名,即:

 alias arg1 'run -app arg1'
 alias arg2 'run -app arg2'
 alias arg3 'run -app arg3'

我知道这是一个 bash 常见问题解答,但 ParsingLs 指南也适用于此。不要解析 ls 的输出。只是不要。你在 csh 中也有 globs。

foreach i (`ls <path>/dir/*.tcl`)

应该只是

foreach i ( <path>/dir/*.tcl )

也就是说,你问的问题正如 Glenn 在评论中所建议的那样。单引号和双引号在 csh 中的行为与在 sh/bash 中的行为非常相似:单引号阻止变量扩展。您的别名实际上并没有设置别名,而是设置了一些东西,当 运行 时会尝试在您 运行 时扩展变量 尝试使用双引号看看这是否能让你得到你期望的行为。

作为 shell 别名的替代策略,考虑将脚本链接或符号链接到路径上的多个名称,然后改为启用 [=12=]。它需要更少的黑客攻击 shells,当有人决定尝试不同的 shell 并忘记这些 "commands" 实际上只是 shell 别名时,这一点尤其明显. :)