在反推中强迫支撑扩展或为什么这不一致?

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)

我明白了:

ls: cannot access /home/user/{a}: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我尝试了各种引用,间距和逃脱但无济于事.我的问题是,有没有办法强制扩张?我意识到如果我自己动起来,我可以一起避免这个问题,但我对这种行为感到好奇

我在bash和tcsh下试过这个.当直接在tcsh下使用时,该命令有效,但在bash下则没有

ImH*_*ere 8

现在,经过几次编辑后,我了解到您可能正在使用两种不同的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的

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的

如果从perl调用 shell命令,在调用shell的情况下,比如在Unix系统下,调用的shell是/bin/sh.

另外一个变化/bin/sh是,在大多数Linux系统中由bash提供服务,通过FreeBSD中tcshOpenBSD中的ksh或csh提供.

很难预测被称为perl的输出/bin/sh.

您可以确保调用特定的shell:

#!/usr/bin/perl
print `/bin/tcsh -c 'ls -d ~/{a,b}'`;
Run Code Online (Sandbox Code Playgroud)

现在问题仍然存在:

  • 为什么需要在单个字符上使用大括号扩展?