是否可以打印出 shell 扩展?

是否可以打印出 shell 扩展?

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

是否可以在 shell 扩展后以形式打印出命令?这似乎是一个很好的实用程序,可以学习并确定 shell 如何扩展特殊字符。

例如

$ echo *

{all the filenames in current dir}

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

echo {all the filenames in .}

答案1

只需使用echo...将其放在要扩展的命令前面即可。我经常使用这种方法。

$ ls
one.txt
two.txt
three.dat
$ echo rm *.txt
rm one.txt two.txt
$ rm *.txt

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

编辑
作为指出在评论中,如果命令不是一个简单的命令(例如,如果它是一个for循环,使用管道|,或者&&其他类似的东西),这将不起作用。

答案2

您可以使用set -x

例如,考虑以下脚本:

$ cat script.sh
set -x
echo *

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

$ bash script.sh
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

Kundor 指出,这种方法也有效互动地在命令行上:

$ set -x
+ set -x
$ echo *
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

文档

man bash解释set -x如下:

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

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

答案3

对于交互式 shell,在输入 glob 模式Ctrl+x后按下 ,*将编辑命令行并展开该 glob 模式。摘自 bash 手册页:

glob-expand-word ( C-x *)

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

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

答案4

如果你想查看参数是如何扩展或标记的,你可以使用打印出其参数的程序或脚本。以下是 中的一个实现bash

#!/bin/bash

for (( i = 0; i <= $#; ++i )); do
    printf 'argv[%d] = %s\n' $i "${!i}"
done

假设你把它放在一个名为的文件中printargs.sh(并使其可执行),那么你将得到如下输出

$ ./printargs.sh a{1..3}b
argv[0] = ./printargs.sh
argv[1] = a1b
argv[2] = a2b
argv[3] = a3b

相关内容