gpt4 book ai didi

bash - for循环中的zsh vs bash区别,zsh方式是什么?

转载 作者:行者123 更新时间:2023-11-29 09:19:16 29 4
gpt4 key购买 nike

假设有一个简单的脚本。

for file in `hadoop classpath | tr ':' ' ' | sort | uniq`; do echo $file; done

hadoop classpath 的原始输出如下所示(查找 jars 的文件夹列表):

zsh %> hadoop classpath  
/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*:/usr/local/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/local/hadoop/contrib/capacity-scheduler/*.jar

如果我在 Bourne shell 中运行上面的脚本,结果将是这样的(它将给出指定类路径中包含的所有 jar 的唯一列表):

bash-4.1$  for file in `hadoop classpath | tr ':' ' ' | sort | uniq`; do echo $file; done
/usr/local/hadoop/etc/hadoop
/usr/local/hadoop/share/hadoop/common/lib/activation-1.1.jar
/usr/local/hadoop/share/hadoop/common/lib/asm-3.2.jar
/usr/local/hadoop/share/hadoop/common/lib/avro-1.7.4.jar
/usr/local/hadoop/share/hadoop/common/lib/commons-beanutils-1.7.0.jar
/usr/local/hadoop/share/hadoop/common/lib/commons-beanutils-core-1.8.0.jar
/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar
/usr/local/hadoop/share/hadoop/common/lib/commons-codec-1.4.jar
...

然而,在 zsh 中,我仍然得到:

zsh %> for file in `hadoop classpath | tr ':' ' ' | sort | uniq`; do echo $file; done        
/usr/local/hadoop/etc/hadoop
/usr/local/hadoop/share/hadoop/common/lib/*
/usr/local/hadoop/share/hadoop/common/*
/usr/local/hadoop/share/hadoop/hdfs
/usr/local/hadoop/share/hadoop/hdfs/lib/*
/usr/local/hadoop/share/hadoop/hdfs/*
/usr/local/hadoop/share/hadoop/yarn/lib/*
/usr/local/hadoop/share/hadoop/yarn/*
/usr/local/hadoop/share/hadoop/mapreduce/lib/*
/usr/local/hadoop/share/hadoop/mapreduce/*
/usr/local/hadoop/contrib/capacity-scheduler/*.jar

(即仅来自类路径的文件夹)。

出于好奇,将目录列表转换为 zsh 中排序的文件列表的方法是什么?

有问题的系统是 Red Hat Enterprise Linux Server 6.5 版。

最佳答案

与 Bourne shell 不同,zsh 在扩展参数后不执行文件名生成。 IE。 $x 的意思就是它所说的,变量 x 的值作为一个参数传递,没有拆分或文件名扩展。要强制空格拆分,请使用 ${=x} 或调用 setopt sh_word_split。要强制文件名扩展,请使用 ${~x} 或调用 setopt glob_subst。为防止 zsh 在目录不包含文件时报错,请使用 (N) 修饰符在模式持续时间内设置 NULL_GLOB 选项。

将所有这些结果结合起来:

classpath=$(hadoop classpath | tr ':' ' ' | sort | uniq)
for file in ${=~classpath}(N); do
echo $file
done

注意 sort |如果您使用 GNU 排序(Linux 上的默认排序),uniq 可以缩短为 sort -u

关于bash - for循环中的zsh vs bash区别,zsh方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24756364/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com