我可以像这样使用tcsh中的sed:
set a = `echo $a | sed -e 's_old_new_'`
一切都很好,但是当我想这样做时:
set a = `echo $a | sed -e 's_old_*new_'`
我可以看到“设置:不匹配”。 。我怎么能逃脱这颗星?
答案 0 :(得分:3)
我对tcsh了解不多,但很少有实验表明设置变量的集合试图扩展右侧*。这可能会有所帮助:
set a="`echo '2e2' | sed -e 's_e_*_'`"
echo "$a"
2*2
echo $a
echo: No match.
所以双引号后面的引号会起作用。
set a = "`echo $a | sed -e 's_old_new_'`"
答案 1 :(得分:0)
未用双引号括起来的命令替换(`
或$(..)
)受文件名扩展(即'globbing')和单词拆分的影响。
通常,变量赋值会抑制RHS的文件名扩展和单词拆分(即使没有双引号),但在命令替换的情况下显然不是文件扩展名。
这是我参考的一项测试:
$ touch randomfile
$ a="*file"
$ var_expand=$a
$ echo "$var_expand"
*file
$
$ cmd_subst=$(echo '*file')
$ echo "$cmd_subst"
randomfile
所以我认为在分配变量时总是双引号命令替换是个好习惯。
safe="$(cmd)"
注意:这是在Bash中测试的,但我认为tcsh在这方面表现出类似的行为。