16

Я знаю, что есть определенный набор правил, которые расширяют команды, набираемые пользователем. (давайте поговорим о оболочке bash.)

Можно ли распечатать команду в форме после расширения оболочки? Кажется, это хорошая утилита, чтобы узнать и убедиться, как оболочка расширяет специальные символы.

например

$ echo *

{all the filenames in current dir}

Я хочу распечатать расширенную команду, которая является следующей строкой:

echo {all the filenames in .}

4 ответа4

12

Вы можете использовать set -x .

Например, рассмотрим скрипт:

$ cat script.sh
set -x
echo *

При запуске он показывает расширенный оператор echo перед его выполнением:

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

И, как указывает Кундор, это также работает в интерактивном режиме в командной строке:

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

Документация

man bash объясняет, что set -x делает следующим образом:

После развертывания каждой простой команды, для команды, команды case, команды выбора или арифметики для команды, отобразите расширенное значение PS4, затем команду и ее расширенные аргументы или связанный список слов.

Значение по умолчанию для PS4 - это, как показано выше, знак плюс, за которым следует пробел.

11

Просто используйте echo ... поместите его перед командой, которую вы хотите расширить. Я использую это довольно часто.

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

Вы можете использовать Home и Del для быстрого добавления / удаления предыдущего echo .

РЕДАКТИРОВАТЬ
Как указано в комментариях, это не будет работать, если команда не является простой командой (например, если это цикл for , используется символ | или && или что-то подобное).

7

Для интерактивной оболочки нажатие Ctrl+x а затем * после ввода шаблона glob отредактирует вашу командную строку с расширенным шаблоном glob. Со страницы руководства bash:

glob-expand-word (C-x *)

Слово перед точкой рассматривается как шаблон для расширения имени пути, и вставляется список совпадающих имен файлов, заменяя слово. Если указан числовой аргумент, перед расширением пути добавляется звездочка.

Вас также могут заинтересовать расширения глобальных списков (Ctrl+x , g).

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .