Що насправді роблять `\ time`,` t \ ime` та `\ cd`? (весело з накидами в оболонках)


9

Обговорюючи відмінності між /usr/bin/timeвбудованою оболонкою (bash та zsh) time, хтось згадав, що можна скористатися \timeяк скорочення /usr/bin/time.

Спочатку це здавалося гарним невинним ярликом, але потім виникли деякі запитання:

  • Чому t\imeтеж працює?
  • Чому \cdзмінюється каталог, навіть якщо though /usr/bin/cdне?

Так очевидно, що \fooне рівнозначно $(which foo). Питання зараз:

Чи спостережувана поведінка \fooв bash і zsh якимось чином охоплюється визначенням POSIX оболонки, і якщо так, то чому він так поводиться?


Виноска 1: /usr/bin/cdє в моїй системі,

#!/bin/sh
builtin cd "$@"

Також дивіться unix.stackexchange.com/questions/12762/… Зауважте, що команда \ спеціально задокументована функція tcsh, яка говорить про ігнорування псевдонімів для команди.
simpleuser

Відповіді:


14

t\imeабо \cd(або "tim"eабо 'cd'або ${-##*}timeабо ${-+time}та будь-яка інша комбінація цитування та розширень, про яку ви могли б подумати, що врешті-решт може вирішитись timeабо cd), це: інший спосіб написання cdта time.

Однак це врешті-решт вирішиться до cdчи timeпізнішого розбору та інтерпретації синтаксису оболонки. Зокрема, це відбувається задовго після того, як відбудеться розпізнавання ключових слів оболонки та заміна псевдоніму .

Отже, на той час, коли оболонка шукає ключові слова на своїй мові, вона не розпізнається ti\meяк timeключове слово оболонки. Отже:

ti\me echo test

оболонка буде розпізнана як проста команда на відміну від timeключового слова, за яким просте команда.

Тоді цитування в ti\meоброблятиметься (тут на зворотному косому котирується mсимвол, котрий не потребує цитування, символ цитування видаляється, ви отримуєте time), і time команда буде шукатись, як і будь-які інші команди (у списку вбудованих , функції та виконувані файли в $PATH. Швидше за все, це буде /bin/timeтут)

Бо в мові оболонки cdнемає cdключового слова, а лише cdвбудована команда (яка має перевагу над вашою /usr/bin/cd). Однак, якщо ви визначите псевдонім для cd(like alias cd=pushd), знову ж. Оскільки заміна псевдоніму робиться дуже рано, перед тим, як вилучити цитати, якщо у вас є псевдонім для, cdа не один \cd(зауважте, що не багато оболонок дозволяють псевдоніми з косою косою рисою), то написавши:

\cd dir

ви переконайтеся, що ваш cdпсевдонім не замінений.

Коротше кажучи, з посиланням на ім'я команди або яку - або його частину НЕ заважає йому бути розглядаються в якості ключового слова оболонки (ключових слів бути речі , як while, for, if, {... timeце ключове слово в деяких тільки оболонках), і обходять псевдонім , ви можете мати для нього .

Однак це не примушує цю команду вирішувати виконуваний файл в $PATH, команда все ще шукається першою серед функцій (якими можна обійтися, виконуючи завдання command time cmd...) та вбудованими (якими ви можете займатися env time cmd..., виконуючи , хоча я не знаю оболонка, яка має вбудовану timeкоманду).

Зверніть увагу , що квотування може також впливати на поведінку спеціальних вбудованих команд в typeset/ declare/ export/ local... сім'ї в деяких оболонках. Див. Чи потрібні лапки для призначення місцевих змінних? для деталей.


Отже, різниця між timeі cdщо призводить до різниці в спостережуваній поведінці, timeполягає в тому, що це ключове слово і cdє вбудованою командою ?
Йонас Шефер

1
@JonasWielicki, це timeключове слово, а cdце не так. (і якщо у вас був псевдонім для cdабо time, це буде інша справа). Це cdє вбудованим чи ні, в цьому моменті немає випадків (що стосується впливу цитування). Однак деякі оболонки мають кілька вбудованих значень, які знаходяться на півдорозі між ключовими словами та вбудованими програмами, оскільки їхній аналіз проводиться інакше, ніж інші вбудовані. Це справа export/ typeset/ declare. Я, мабуть, повинен додати якусь примітку про це у цій відповіді.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.