我知道有一组特定的规则,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
您可以使用Home和Del快速添加/删除前面的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