使用变量在 shell 脚本中创建别名
Create alias in shell script using a variable
我有一个目录“/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'
我知道这是一个 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 别名时,这一点尤其明显. :)
我有一个目录“/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'
我知道这是一个 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 别名时,这一点尤其明显. :)