![Solaris 和 Linux shell 中命令的区别](https://linux22.com/image/101728/Solaris%20%E5%92%8C%20Linux%20shell%20%E4%B8%AD%E5%91%BD%E4%BB%A4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
我从 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
做在这种情况下删除外部大括号(尽管它也接受尾随逗号形式 - 正如ksh
和zsh
显然一样):
csh % echo {MYDIR{85,97}}
MYDIR85 MYDIR97
csh % echo {MYDIR{85,97},}
MYDIR85 MYDIR97