我想做以下
export LOGS=//server/log_files/2014_*/server_{1,2,3}
所以我可以做类似
的事情 grep 'Exception' $LOGS/log.txt
我也尝试了别名,但我不能让它不扩展。
我怎么能这样做?
答案 0 :(得分:1)
如果没有export
,作业的右侧不会通过路径也不会支持扩展。
但是,使用export
,执行大括号扩展。您可以通过引用值来阻止它:
export LOGS='//server/log_files/2014_*/server_{1,2,3}'
但是,如果要使用此类值,则必须使用eval
:
eval grep 'Exception' $LOGS/log.txt
答案 1 :(得分:1)
你是想要扩展球的情况。这是最干净,最语义正确的,因为你想匹配文件名。由于我过于迂腐,我认为大括号扩展不适合你的任务。
# This defines a string that will glob
# No pathname expansions are performed at this step
logs_glob='//server/log_files/2014_*/server_@(1|2|3)'
# You need to activate extended globs with extglob
# To have a failure when no files match the glob, you need failglob
shopt -s failglob extglob
# Unquoted variable $logs_glob, as pathname expansion is desirable
grep 'Exception' $logs_glob
有人会说,使用glob技术,你无法正确处理名称中的空格。实际上,您有两种方法:使用?
作为通配符(这将匹配任何字符,特别是空格)或使用字符类[[:space:]]
。此字符类将匹配任何空格(常规空格,换行符,制表符等)
另一种技术是使用数组,仍然使用扩展的globs。我认为这更清洁了。
shopt -s extglob nullglob
# This will populate array with all matching filenames.
# If no matches, array is empty (since we shopted nullglob)
logs_array=( //server/log_files/2014_*/server_@(1|2|3) )
# Before you launch you command with the array, make sure it's not empty:
if ((${#logs_array[@]}!=0)); then
# Observe the quotes for the expansion of the array
grep 'Exception' "${logs_array[@]}"
fi