Nul*_*man 1 linux bash shell perl tcsh
当使用反引号(在perl中)时,我似乎与大括号扩展有某种不一致
print `ls -d ~/{a,b}`;
Run Code Online (Sandbox Code Playgroud)
工作正常,但当我尝试
print `ls -d ~/{a}`;
Run Code Online (Sandbox Code Playgroud)
我明白了:
Run Code Online (Sandbox Code Playgroud)ls: cannot access /home/user/{a}: No such file or directory
我尝试了各种引用,间距和逃脱但无济于事.我的问题是,有没有办法强制扩张?我意识到如果我自己动起来,我可以一起避免这个问题,但我对这种行为感到好奇
我在bash和tcsh下试过这个.当直接在tcsh下使用时,该命令有效,但在bash下则没有
现在,经过几次编辑后,我了解到您可能正在使用两种不同的shell.并且,那个调用shell的人是perl,而不是你.
所以,要涵盖三个要素:
在bash中.简单的{a}将不会展开:
$ echo ~/{a,b}
/home/user/a /home/user/b
$ echo ~/{a}
/home/user/{a}
Run Code Online (Sandbox Code Playgroud)
哪个被搜索为文件ls,但未找到.
手册man bash的相关部分是(强调我的):
正确形成的大括号扩展必须包含不带引号的开括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式.
A {a}缺少必需的逗号.
唯一的选择是实际使用
$ print `ls -d ~/a`
Run Code Online (Sandbox Code Playgroud)
在tcsh:一个简单的{A}将被扩展(如在一个csh壳):
使用>作为用于tcsh的提示壳指示符:
> echo --{a,b}++
--a++ --b++
> echo --{a}++
--a++
Run Code Online (Sandbox Code Playgroud)
简单{}也会:
$ echo --{}++
--++
Run Code Online (Sandbox Code Playgroud)
将唯一的括号不被删除会{}和{和}.
IIF(当且仅当如此)它们被认为是"单词".最常见的是空格包围:
$ echo --{}++ == {} .. { :: } aa { bb
--++ == {} .. { :: } aa { bb
Run Code Online (Sandbox Code Playgroud)
如果a {或a }作为单词的一部分出现,没有匹配的大括号,则是错误:
> echo aa{bb
Missing '}'.
Run Code Online (Sandbox Code Playgroud)
关于man tcsh的唯一描述真的很短(不清楚?):
> As a special case the words `{', `}' and `{}' are passed undisturbed.
Run Code Online (Sandbox Code Playgroud)
如果从perl调用 shell命令,在调用shell的情况下,比如在Unix系统下,调用的shell是/bin/sh.
另外一个变化/bin/sh是,在大多数Linux系统中由bash提供服务,通过FreeBSD中的tcsh和OpenBSD中的ksh或csh提供.
很难预测被称为perl的输出/bin/sh.
您可以确保调用特定的shell:
#!/usr/bin/perl
print `/bin/tcsh -c 'ls -d ~/{a,b}'`;
Run Code Online (Sandbox Code Playgroud)
现在问题仍然存在: