как заставить cURL отправлять команду AUTH для FTPS?

Часть руководства Bash, которую вы процитировали, говорит о

Aliases are expanded when a command is read, not when it is executed. Therefore, an alias definition appearing on the same line as another command does not take effect until the next line of input is read.

Таким образом, псевдонимы на самом деле являются одним из тех примеров, которые показывают разницу между чтением и выполнением строки!

Чтобы пояснить, вот составная команда. Сначала мы пытаемся определить псевдоним, а затем пытаемся его использовать :

.

alias echo=uname; echo

Кто-то, кто не знаком с Bash, может ожидать, что вывод этой команды будетLinux(или любой другой ОС, которую вы используете ), но на самом деле она просто ничего не выводит. Это связано с тем, что Bash сначала читает строку и применяет определения псевдонимов. Вот что видит Баш:

alias echo=uname; echo

Обратите внимание, что второй echoне преобразуется в uname. Это потому, что Bash еще не выполнил нашу команду alias echo=uname, он только прочитал ее . После того, как Bash прочитал строку, он выполняет то, что прочитал. Поэтому он выполняет:

alias echo=uname; echo(это именно то, что он читал, как описано выше)

Мы даже можем проверить, выполнил ли Bash команду, набрав echo. Поскольку ранее мы определили псевдоним, echoтеперь будет преобразовано в unameво время шага чтения, поэтому Bash выполнит uname.

Короче:

$ alias echo=uname; echo

$ echo
Linux

Редактировать:

После редактирования вы спросили, есть ли способ отобразить результаты после того, как Bash прочитает одну строку ввода, но до их фактического выполнения. Ответ - да,но это не очень удобно для -повседневного использования (однако, безусловно, полезно для понимания того, что происходит внутри оболочки ).

Создайте файл со следующим содержимым:

#!/bin/bash
shopt -s expand_aliases
trapped() {
    echo "On line ${1}, Bash sees: $BASH_COMMAND"
}
trap 'trapped ${LINENO}' DEBUG
alias echo=uname; echo
echo

Затем запустите этот файл.

Вот объяснение того, как работает этот скрипт:

  • shopt -s expand_aliasesуказывает Bash расширять псевдонимы, даже если он находится в неинтерактивном режиме (, как в этом случае)
  • Затем мы определяем функцию trapped(). При вызове эта функция напечатает выполняемую в данный момент команду (вместе с номером строки, который передается как параметр ).
  • Звоним trap 'trapped ${LINENO}' DEBUG. Это сообщает Bash: «Всякий раз, когда вы видите сигнал с именем DEBUG, сначала выполните trapped ${LINENO}. DEBUG— это сигнал, автоматически генерируемый Bash перед любым выполнением простой команды . Другими словами, перед выполнением любой команды вызывается наша функция trapped().
  • Наконец, мы выполняем несколько команд для демонстрации. Однако, поскольку у нас есть ловушка, trapped()выполняется до того, как произойдет что-либо еще, поэтому Bash печатает то, что должно быть выполнено. Переменная LINENO— это просто встроенная в Bash -, которая дает нам текущий номер строки.

Если вы хотите иметь возможность «запускать» команды, вообще не выполняя их, и по-прежнему видеть, что читает Bash, вы можете изучить параметр extdebugв руководстве Bash.

2
09.04.2018, 11:10
0 ответов

Теги

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