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


18

我知道有一组特定的规则可用于外壳扩展用户键入的命令。(让我们讨论一下bash shell。)

Shell扩展后是否可以以表格形式打印出命令?学习并确保shell如何扩展特殊字符似乎是一个很好的实用工具。

例如

$ echo *

{all the filenames in current dir}

我想打印出扩展的命令,这是以下行:

echo {all the filenames in .}

Answers:


13

只需使用echo...将它放在您要扩展的命令前面即可。我经常使用它。

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

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

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


1
这是我在测试脚本时所做的
Barmar 2015年

这仍然受到其他shell令牌的影响,echo cat * | someprogram但您并未从此答案中想到。
Kroltan'1

13

您可以使用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如下:

展开每个简单命令(对于命令,大小写命令,选择命令或对命令的算术)后,显示PS4的扩展值,然后显示该命令及其扩展的参数或关联的单词列表。

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


2
而且它也可以在交互式外壳中正常工作(我认为OP正在寻找它。)
Nick Matteo 2015年

7

对于交互式外壳,在键入glob模式后按,Ctrl+x然后按*,将在扩展该glob模式的情况下编辑命令行。从bash手册页:

全局扩展词(C-x *

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

您可能也对glob-list-expansions(Ctrl+xg)感兴趣。


我正在从Mac OS使用bash。我尝试了ctrl + x,command + x。我不确定是否进行任何命令行编辑。您能否详细说明?
曾伟石

@WeishiZeng我不知道为什么它对您不起作用。您是否Ctrl+x, *在键入后立即echo *按Enter键?如果仍然无法使用,则可以修改~/.inputrcglob-expand-word并将其绑定到其他内容。
jamesdlin

contrl + x将光标移至单词echo,但不进行任何编辑。“ Ctrl + x ”是什么意思?(是ctrl + x还是ctrl +
曾伟石2015年

右,按,Ctrl+x然后按Shift+8。您可以尝试选择是否可行Ctrl+x, g,或者,正如我前面所说的,在.inputrc文件中分配您自己的密钥。
jamesdlin

1

如果要查看参数如何扩展或标记化,可以使用打印出其参数的程序或脚本。这是一个实现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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.