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



我有一个目录说"/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并且应用程序值不知何故始终是退出 foreach 循环后的最后一个值,即在这种情况下为 arg3。我无法创建像上面的打印消息这样的别名,即:

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

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

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

应该只是

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

也就是说,您询问的问题正如格伦在评论中建议的那样。单引号和双引号在 csh 中的行为方式与在 sh/bash 中的行为方式大致相同:单引号阻止变量扩展。您的别名实际上并没有设置别名,而是在设置一些东西,运行时将尝试在您运行时扩展变量。尝试使用双引号,看看是否能让您获得预期的行为。

作为 shell 别名的替代策略,请考虑将脚本链接或符号链接到路径上的多个名称,然后改为打开$0。它需要较少的 shell 黑客攻击,当有人决定尝试不同的 shell 并忘记这些"命令"实际上只是 shell 别名时,这一点尤其明显。:)

最新更新