Ваш вопрос не кристально ясен, но ваше сопоставление предложений
Aliases are expanded when a command is read, not when it is executed.
и
Bash always reads at least one complete line of input before executing any of the commands on that line.
предполагает, что в центре внимания вашего вопроса находится расширение псевдонима. (Я говорю «предполагает», потому что, помимо выдержки из руководства Bash, в вашем вопросе вообще не упоминаются псевдонимы.)
Первоначальная версия вашего вопроса
How can I show that Bash always reads at least one complete line of input before executing any of the commands on that line?
Единственный реальный способ сделать это заключается в использовании какого-либо инструмента отладки / мониторинга / трассировки изучить внутреннее состояние оболочки. Это несколько непрактично. Ответ PawkyPenguin показывает подход к тому, чтобы приводить -сомнительные аргументы в поддержку того, что говорится в руководстве. Вот вариант их ответа, который (ИМО )немного яснее:
$ alias myalias=date $ alias myalias="ls -ld"; myalias Fri, Aug 04, 2017 3:33:33 AM
Мы можем утверждать, что оболочка должна полностью прочитать (вторую )полную строку прежде чем он начал выполнять его потому что, когда он выполнил myalias
, он выполнил его как date
. К моменту выполнения псевдонима myalias
он был переопределен как ls -ld
. Следовательно, оболочка должна была расшириться с myalias
на date
. перед выполнением
alias myalias="ls -ld"
, поэтому она должна прочитать всю строку ввода перед выполнением любой из команд в этой строке.
Ваш измененный вопрос,
How can I show the results after Bash reads one complete line of input but before executing any of the commands on that line?
имеет немного больше смысла в этом контексте. Думаю, вы хотите увидеть командную строку с расширенными псевдонимами . перед выполнением любой из команд в этой строке; см. результаты расширения псевдонима. Я думаю, вы хотите увидеть что-то вроде
alias myalias="ls -ld"; date
Насколько я знаю, нет никакого способа получить этот вывод — развернута полная строка с псевдонимами. Но вариантxtrace
(-x
)подходит близко.
$ set -x $ alias myalias=date + alias myalias=date $ alias myalias="ls -ld"; myalias + alias 'myalias=ls -ld' + date ← The expansion of the alias Fri, Aug 04, 2017 3:33:42 AM
Конечно, это выводит каждую расширенную команду только непосредственно перед его выполнением, поэтому результаты расширения псевдонима смешиваются с выводом команд. Также,это показывает все расширения:
$ animal=cat + animal=cat $ echo Hello; echo world; myalias "$animal" R* + echo Hello Hello + echo world world + ls -ld cat README ← The expansion of the alias ls: cannot access cat: No such file or directory -rw-r--r-- 2 myusername mygroupname 489 Feb 22 2015 README
Мы не увидим ls -ld "$animal" R*
; мы видим это только после расширения переменной и пути (glob ). Он также не «хорошо работает» с конвейерами :
.
$ alias myalias=date + alias myalias=date $ myalias | od -cb + date ← The expansion of the alias + od -cb 0000000 F r i , A u g 0 4 , 2 0 1 106 162 151 054 040 101 165 147 040 060 064 054 040 062 060 061 0000020 7 9 : 4 2 : 1 7 P M \n 067 040 040 071 072 064 062 072 061 067 040 120 115 012 0000036
, где вывод трассировки показывает нам date
и od -cb
в двух отдельных строках. (Вам нужно посмотреть исходную командную строку выяснить, что он делает date | od -cb
, если это не было очевидно из вывода.)
если у вас есть root:
salt=$(awk -F\$ '$1 ~ /student:/ { print $3 }' /etc/shadow)
hashedpasswd=$(awk -F: '$1 == "student" { print $2} ' /etc/shadow)
expected=$(mkpasswd -m sha-512 given-passwd $salt)
if [ "$hashedpasswd" = "expected" ]
then
echo good
else
echo bad
fi
student
на возмутительную строку, конечно. given-passwd
. подробнее см. мой вопрос:/etc/shadow :как сгенерировать зашифрованный пароль $6$?