为什么我不能在子shell中执行 ls *.txt ?

Jim*_*Jim 13 shell quoting

~$ echo $(ls)  
arguments.txt cecho.sh Desktop Documents Downloads example.txt Music Pictures Public     
~$ echo $(ls "*.txt")  
ls: cannot access *.txt: No such file or directory  
Run Code Online (Sandbox Code Playgroud)

为什么第二个子shell命令失败?

小智 30

就像你不能ls "*.txt"在普通 shell 中运行一样,你也不能在子 shell 中运行它。当您加上*.txt引号时,您ls搜索了一个名为*.txtwhen的文字文件,而您应该这样做:

$ echo $(ls *.txt) # => file.txt otherfile.txt
Run Code Online (Sandbox Code Playgroud)

一个更好的方法是根本不使用ls

$ echo *.txt # => file.txt otherfile.txt
Run Code Online (Sandbox Code Playgroud)

  • +1 用于删除多余的 `ls`。 (7认同)
  • 挑剔:你**可以**运行`ls -l "*.txt"`。或者至少我可以。我不经常这样做,但是当我这样做时,它通常告诉我它找不到 *.txt ... (3认同)

mkc*_*mkc 27

删除周围的引号*.txt,它应该可以工作。带引号的 shell 将查找文字文件名*.txt。要探索/实验,请尝试创建一个名为*.txtas的文件touch '*.txt'并重复该命令。

  • 请注意,双引号(至少在 `bash` 和类似的 shell 中(如 `zsh`)与单引号不同!例如,参数扩展(`$foo`)在双引号内完成,但不是单引号。 (6认同)