Як я бачу, яка команда насправді виконувалася в оболонці, через псевдонім або функцію


20

Наприклад, у мене є функція bash (або псевдонім) function install() {sudo apt-get install $@}. Під час виконання команди install dicelab, я очікую, що насправді буде запущено sudo apt-get install dicelab. Де я можу побачити, чим насправді керував панцир? Я хотів би переконатися, що мої складніші псевдоніми працюють так, як очікувалося.


Це $@частина вашого псевдоніма? Пам'ятайте, що псевдоніми насправді не підтримують аргументи, які розширяться до позиційних параметрів (якщо такі є) контексту, що викликає псевдонім. Звичайний спосіб запуску somealias some argsпрацює лише шляхом розширення псевдоніму та залишення аргументів для його виконання. Якщо ви дійсно хочете мати можливість отримати доступ до аргументів, використовуйте функцію та "$@"
цитуйте


1
@AlonAviv, Добре. :) І все-таки найкраще ввійдіть у звичку цитувати це "$@", аргументи з пробілами або символами глобуса згорять інакше.
ilkkachu

1
@DarkHeart Це не дублікат. Інше питання не стосується функцій оболонки.
Кусалаланда

2
Не було цього, поки його не відредагували, щоб повністю змінити тему (і визнати недійсною одну з існуючих відповідей).
Майкл Гомер

Відповіді:


29

Використання set -xв оболонці.

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

Використання set -xчерзі на xtraceопції оболонки ( set +xвимикає) і повинні працювати у всіх Bourne-подібних оболонок, як bash, dash ksh93, pdkshі zsh. Це спонукає оболонку до відображення команди, яка виконується після виконання псевдонімів розширень та змінних розширень тощо.

Вихід буде в стандартному потоці помилок оболонки (як і у звичайному запиті), тому він не буде перешкоджати перенаправленням стандартного виводу, і йому передуватиме запит, визначений PS4змінною оболонки ( +␣за замовчуванням).

Приклад з кількома функціями:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

Я працюю з set -xусіма своїми інтерактивними оболонками за замовчуванням. Приємно бачити, що насправді виконується ... але я помітив, що програмоване заповнення вкладок тощо може спричинити небажаний вихід слідів у деяких оболонках.


14

Ви можете використовувати shell-expand-line, що за замовчуванням пов'язано з Control- Alt-e

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

Крім усього іншого, він замінить псевдоніми в поточному рядку їх визначенням, щоб ви могли побачити команду, яку ви все ще збираєтеся виконувати. Приклад:

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this

це приємна особливість. чи знаєте ви, чи має команда zsh еквівалентна команді shell-expand-line?
the_velour_fog

Вибачте, я цього не роблю, бо не використовую zsh. Але деякі люди придумали власні ідеї: wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
Аркадіуш Драбчик


1

Ви можете використовувати bash вбудований typeдля того, щоб побачити псевдонім або визначення функції, яке ви збираєтеся запустити:

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.