Solaris 和 Linux shell 中命令的区别

Solaris 和 Linux shell 中命令的区别

我从 shell 脚本中得到了这个片段,它在 Solaris 环境中完美运行

grep -h '??.*??' $1/{CT,{MYDIR{85,97}}{,_E}}/R*txt

但是当我尝试在 ubuntu 中运行 shell 脚本时,出现以下错误

grep: ./{MYDIR85}/R*txt: No such file or directory
grep: ./{MYDIR85}_E/R*txt: No such file or directory

经过一点编辑后它可以正常运行,我删除了 MYDIR 的大括号

grep -h '??.*??' $1/{CT,MYDIR{85,97} {,_E}}  /R*txt

我想知道问题出在哪里,是linux和solaris命令不兼容吗?

注意-i有三个目录MYDIR85、MYDIR97和CT-在ubuntu中,shell是/bin/bash-在solaris中我不知道shell类型,但是shell脚本的第一行是#!/bin/bash

答案1

根据bash手册页

正确形成的大括号扩展必须包含未加引号的左大括号和右大括号,和至少一个不带引号的逗号或有效的序列表达式。任何错误形成的大括号扩展都保持不变。

在你的表达中{MYDIR{85,97}}大括号既没有不带引号的逗号,也没有序列表达式,因此未展开 - 导致{MYDIR85} {MYDIR97}.仅出于说明目的,您可以通过添加尾随逗号来获得所需的行为:

bash $ echo {MYDIR{85,97},}
MYDIR85 MYDIR97

尽管这会_E在复合表达式中引入额外的(可能是不需要的)元素{CT,{MYDIR{85,97}}{,_E}}


我不知道为什么您会在 Solaris 下看到不同的行为,但要注意的是csh 在这种情况下删除外部大括号(尽管它也接受尾随逗号形式 - 正如kshzsh显然一样):

csh % echo {MYDIR{85,97}}
MYDIR85 MYDIR97
csh % echo {MYDIR{85,97},}
MYDIR85 MYDIR97

相关内容