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

2659
Weishi Zeng

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

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

например

$ echo *   

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

echo 
15

4 ответа на вопрос

12
John1024

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

И это прекрасно работает и в интерактивной оболочке (которую, я думаю, ищет ОП). Kundor 9 лет назад 2
10
BenjiWiebe

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

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

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

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

Это то, что я делаю при тестировании скрипта Barmar 9 лет назад 1
На это все еще влияют другие токены оболочки `echo cat * | someprogram` не делает то, что вы думаете из этого ответа. Kroltan 9 лет назад 0
7
jamesdlin

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

glob-expand-word ( C-x *)

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

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

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

Если вы хотите увидеть, как аргументы раскрываются или маркируются, вы можете использовать программу или скрипт, который выводит их аргументы. Вот одна реализация в bash:

#!/bin/bash  for (( i = 0; i <= $#; ++i )); do printf 'argv[%d] = %s\n' $i "${!i}" done 

Предполагая, что вы поместите это в файл с именем printargs.sh(и сделаете его исполняемым), вы получите такой вывод

$ ./printargs.sh ab argv[0] = ./printargs.sh argv[1] = a1b argv[2] = a2b argv[3] = a3b 

Похожие вопросы