我有一个目录说“/ dir”。在此目录中,我的文件名为arg1_config.tcl
,arg2_config.tcl
,arg3_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'
答案 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别名时,这将特别明显。 :)