Чи можливо роздрукувати розширення оболонки?


18

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

Чи можливо роздрукувати команду у формі після розширення оболонки? Здається, це корисна програма для вивчення та переконання, як оболонка розширює спеціальні символи.

напр

$ 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цикл, використовує трубу |, або &&чи що - небудь ще в цьому роді).


1
Це те, що я роблю під час тестування сценарію
Бармар

На це все ще впливають інші символи оболонки, 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

І, як Kundor вказує, це також працює в інтерактивному режимі в командному рядку:

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

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

man bashпояснює, що set -xтаке:

Розгорнувши кожну просту команду, на команду, команду регістру, виберіть команду або арифметику для команди, виведіть розширене значення PS4, за яким слід команда та її розширені аргументи або пов'язаний список слів.

Значенням за замовчуванням для PS4, як показано вище, є знак плюс, за яким пробіл.


2
І він чудово працює і в інтерактивній оболонці (що, на мою думку, ОР шукає.)
Нік Маттео

7

Для інтерактивної оболонки натискання, Ctrl+xа потім *після введення шаблону глобуля редагує ваш командний рядок із розширеним шаблоном глобуса. З сторінки "bash man":

glob-expand-word ( C-x *)

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

Можливо, вас також зацікавлять глобальні розширення ( Ctrl+x, g).


Я використовую bash з Mac OS. Я спробував ctrl + x, command + x. Я не впевнений, чи це редагування командного рядка. Ви могли б детальніше розробити?
Weishi Zeng

@WeishiZeng Я не знаю, чому це не працює для вас. Ви натискали Ctrl+x, *відразу після введення echo *та перед натисканням клавіші введення? Якщо вона все ще не працює, ви можете змінити ~/.inputrcі прив'язати глобус-розширити слово до чогось іншого.
jamesdlin

contrl + x переміщує курсор на слово echo, але нічого не редагує. "Ctrl + x ", що це означає ?? (це ctrl + x АБО ctrl + ??) * знаходиться на Shift, тому мені потрібно також натиснути Shift, щоб отримати *, правда?
Weishi Zeng

Праворуч натисніть, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.