是否可以打印出外壳扩展?

Wei*_*i Z 19 bash shell wildcards expansion

我知道有一组特定的规则可以让 shell 扩展用户输入的命令。(让我们谈谈 bash shell。)

shell扩展后是否可以打印出表单中的命令?它似乎是一个很好的实用工具,可以学习和确定 shell 如何扩展特殊字符。

例如

$ echo *

{all the filenames in current dir}
Run Code Online (Sandbox Code Playgroud)

我想打印出展开的命令,即以下行:

echo {all the filenames in .}
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 15

您可以使用set -x.

例如,考虑脚本:

$ cat script.sh
set -x
echo *
Run Code Online (Sandbox Code Playgroud)

运行时,它会echo在实际执行之前显示扩展语句:

$ bash script.sh
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh
Run Code Online (Sandbox Code Playgroud)

而且,正如 Kundor 所指出的,这也可以在命令行上以交互方式工作:

$ set -x
+ set -x
$ echo *
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh
Run Code Online (Sandbox Code Playgroud)

文档

man bash解释set -x如下:

展开每个简单命令后,for command、case 命令、select 命令或算术for 命令,显示PS4 的展开值,后面是命令及其展开的参数或关联的单词列表。

PS4如上所示,默认值是一个加号后跟一个空格。

  • 而且它在交互式 shell 中也能正常工作(我认为 OP 正在寻找它。) (2认同)

Ben*_*ebe 13

只需使用echo...把它放在你想扩展的命令前面。我经常使用这个。

$ ls
one.txt
two.txt
three.dat
$ echo rm *.txt
rm one.txt two.txt
$ rm *.txt
Run Code Online (Sandbox Code Playgroud)

您可以使用HomeDel快速添加/删除前面的echo.

编辑
正如指出的意见,如果该命令不只是一个简单的命令(例如,如果它是一个这是不行的for循环,使用管道|,或&&或其他任何类似的)。


jam*_*lin 8

对于交互式 shell,在键入 glob 模式后按Ctrl+x后跟*将编辑命令行并扩展该 glob 模式。从 bash 手册页:

全局扩展词 ( C-x *)

point 之前的单词被视为路径名扩展的模式,并插入匹配的文件名列表,替换该单词。如果提供了数字参数,则在路径名扩展之前附加星号。

您可能还对 glob-list-expansions ( Ctrl+x, g)感兴趣。