Можно ли распечатать расширение оболочки?
Я знаю, что есть определенный набор правил, которые расширяют команды, введенные пользователем. (давайте поговорим о оболочке bash.)
Можно ли распечатать команду в форме после расширения оболочки? Кажется, это хорошая утилита, чтобы узнать и убедиться, как оболочка расширяет специальные символы.
например
$ echo *
{all the filenames in current dir}
Я хочу распечатать расширенную команду, которая является следующей строкой:
echo {all the filenames in .}
4 ответа
Просто используйте echo
... поместите его перед командой, которую вы хотите расширить. Я использую это довольно часто.
$ ls
one.txt
two.txt
three.dat
$ echo rm *.txt
rm one.txt two.txt
$ rm *.txt
Вы можете использовать Home и Del для быстрого добавления / удаления предыдущего echo
,
РЕДАКТИРОВАТЬ
Как указано в комментариях, это не будет работать, если команда не является простой командой (например, если это for
петля, использует трубу |
, или же &&
или что-нибудь еще в этом роде).
Ты можешь использовать set -x
,
For example, consider the script:
$ cat script.sh
set -x
echo *
When run, it shows the expanded echo
statement before actually executing it:
$ bash script.sh
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh
And, as Kundor points out, this also works interactively on the command line:
$ set -x
+ set -x
$ echo *
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh
Документация
man bash
explains what set -x
does as follows:
После развертывания каждой простой команды, для команды, команды case, команды выбора или арифметики для команды, отобразите расширенное значение PS4, затем команду и ее расширенные аргументы или связанный список слов.
Значение по умолчанию для PS4
is, as shown above, a plus sign followed by a space.
Для интерактивной оболочки, нажав Ctrl+x
с последующим *
после ввода шаблона glob отредактируйте вашу командную строку с расширенным шаблоном glob. Со страницы руководства bash:
glob-expand-word (
C-x *
)Слово перед точкой рассматривается как шаблон для расширения пути, и вставляется список совпадающих имен файлов, заменяя слово. Если задан числовой аргумент, перед расширением пути добавляется звездочка.
Вас также могут заинтересовать расширения глобальных списков (Ctrl+x
, g
).
Если вы хотите увидеть, как аргументы расширяются или маркируются, вы можете использовать программу или скрипт, который выводит их аргументы. Вот одна реализация в 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