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

时间:2017-08-22 23:37:01

标签: shell variables alias csh

我有一个目录说“/ 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'

1 个答案:

答案 0 :(得分:2)

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

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

应该只是

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

那就是说,你问的问题就像格伦在评论中所说的那样。单引号和双引号在csh中的行为与在sh / bash中的行为大致相同:单引号阻止变量扩展。你的别名实际上并没有设置别名,它设置了一些在运行时会尝试在你运行时扩展变量的东西。尝试使用双引号,看看是否能得到你期望的行为。

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