bash导出表达式而不展开?

bash导出表达式而不展开?,bash,cygwin,Bash,Cygwin,我想做以下几件事 export LOGS=//server/log_files/2014_*/server_{1,2,3} 所以我可以做一些像 grep'Exception'$LOGS/log.txt 我也尝试了alias,但无法使其不扩展 我怎样才能做到这一点呢?如果没有导出,作业的右侧不会经过路径或大括号展开 但是,通过导出,将执行大括号扩展。您可以通过引用以下值来防止它: export LOGS='//server/log_files/2014_*/server_{1,2,3}' 但是,

我想做以下几件事

export LOGS=//server/log_files/2014_*/server_{1,2,3}

所以我可以做一些像

grep'Exception'$LOGS/log.txt

我也尝试了alias,但无法使其不扩展


我怎样才能做到这一点呢?

如果没有导出,作业的右侧不会经过路径或大括号展开

但是,通过导出,将执行大括号扩展。您可以通过引用以下值来防止它:

export LOGS='//server/log_files/2014_*/server_{1,2,3}'
但是,如果要使用这样的值,则必须使用
eval

eval grep 'Exception' $LOGS/log.txt

你现在的情况是,你需要扩展globs。这是这里最干净、语义最正确的,因为您希望匹配文件名。由于我过于迂腐,我认为括号扩展不是完成任务的正确工具

# 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:]
。此字符类将匹配任何空格(常规空格、换行符、制表符等)


另一种技术是使用阵列,仍然使用扩展的glob。我认为这更干净

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

是的,但是当我尝试
ls$LOGS/log.txt
时,我会得到“无法访问//服务器/log\u文件/2014\u*/server\u{1,2,3}/log.txt:没有这样的文件或目录”,它会将其保存为未扩展(当我引用它时),但当我尝试使用它时它不会扩展。谢谢,我不知道扩展globs。虽然我在cygwin上试用过,但它挂起在grep命令上(甚至只是
ls$logs\u glob
)。@anthonybell什么版本的Bash?GNU Bash,版本4.1.10(4)-在Windows 7上发布(i686 pc cygwin),64位。@anthonybell:检查extglobs在cygwin上是否工作。测试很简单:在scratch目录中
scratch_dir
触摸测试{a..z};shopt-s extglob;回声测试(a | b | c | d)
应该输出
测试a测试b测试c测试d
,也可以从父目录尝试它:
cd。。;echo scratch_dir/test_@(a | b | c | d)
。如果这能奏效,一切都是好的。在cygwin中,领先的
/
是什么意思?是的,这很有效。
//服务器
用于windows中的网络目录。