Можно ли распечатать расширение оболочки?

18

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

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

например

$ echo *

{all the filenames in current dir}

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

echo {all the filenames in .}
Вейши Цзэн
источник

Ответы:

13

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

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

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

EDIT
Как отметил в комментарии, это не будет работать , если команда не просто команда (например , если это forцикл, использует трубу |, или &&или что - нибудь еще в этом роде).

BenjiWiebe
источник
1
Это то, что я делаю при тестировании сценария
Barmar
На это по-прежнему влияют другие токены оболочки echo cat * | someprogram, которые не делают то, что вы думаете из этого ответа.
Кролтан
13

Вы можете использовать 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, как показано выше, является знак плюс, за которым следует пробел.

John1024
источник
2
И это прекрасно работает и в интерактивной оболочке (которую, я думаю, ищет ОП).
Ник Маттео
7

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

glob-expand-word ( C-x *)

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

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

jamesdlin
источник
Я использую Bash от Mac OS. Я попытался Ctrl + X, команда + X. Я не уверен, что он редактирует командную строку. не могли бы вы рассказать подробнее?
Вейши Цзэн
@WeishiZeng Я не знаю, почему это не работает для вас. Вы нажали Ctrl+x, *сразу после ввода echo *и до нажатия клавиши ввода? Если это все еще не работает, вы можете изменить ~/.inputrcи связать glob-expand-word с чем-то другим.
Джеймсдлин
contrl + x перемещает курсор на слово echo, но ничего не редактирует. "Ctrl + x ", что это значит ?? (это ctrl + x ИЛИ ctrl + ??) * на Shift, поэтому мне нужно нажать Shift, чтобы получить *, верно?
Weishi Zeng
Правильно, нажмите, Ctrl+xа затем Shift+8. Вы можете попробовать seing, если Ctrl+x, gработает, или, как я уже говорил ранее, назначить свой собственный ключ в .inputrcфайле.
Джеймсдлин
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
jjlin
источник