Глава 23. Псевдонимы


Псевдонимы в Bash — это ни что иное, как "горячие клавиши", средство, позволяющее избежать набора длинных строк в командной строке. Если, к примеру, в файл ~/.bashrc вставить строку alias lm="ls -l | more", то потом вы сможете экономить свои силы и время, набирая команду lm, вместо более длинной ls -l | more. Установив alias rm="rm -i" (интерактивный режим удаления файлов), вы сможете избежать многих неприятностей, потому что сократится вероятность удаления важных файлов по неосторожности.

Псевдонимы в сценариях могут иметь весьма ограниченную область применения. Было бы здорово, если бы псевдонимы имели функциональность, присущую макроопределениям в языке C, но, к сожалению, Bash не может "разворачивать" аргументы в теле псевдонима. [54] Кроме того, попытка обратиться к псевдониму, созданному внутри "составных конструкций", таких как if/then, циклы и функции, будет приводить к появлению ошибок. Практически всегда, действия, возлагаемые на псевдоним, более эффективно могут быть выполнены с помощью функций.

Пример 23-1. Псевдонимы в сценарии

  1. #!/bin/bash
  2. shopt -s expand_aliases
  3. # Эта опция должна быть включена, иначе сценарий не сможет "разворачивать" псевдонимы.
  4. alias ll="ls -l"
  5. # В определении псевдонима можно использовать как одиночные ('), так и двойные (") кавычки.
  6. echo "Попытка обращения к псевдониму \"ll\":"
  7. ll /usr/X11R6/bin/mk*   #* Работает.
  8. echo
  9. directory=/usr/X11R6/bin/
  10. prefix=mk*  # Определить — не будет ли проблем с шаблонами.
  11. echo "Переменные \"directory\" + \"prefix\" = $directory$prefix"
  12. echo
  13. alias lll="ls -l $directory$prefix"
  14. echo "Попытка обращения к псевдониму \"lll\":"
  15. lll         # Список всех файлов в /usr/X11R6/bin, чьи имена начинаются с mk.
  16. # Псевдонимы могут работать с шаблонами.
  17. TRUE=1
  18. echo
  19. if [ TRUE ]
  20. then
  21.   alias rr="ls -l"
  22.   echo "Попытка обращения к псевдониму \"rr\", созданному внутри if/then:"
  23.   rr /usr/X11R6/bin/mk*   #* В результате — сообщение об ошибке!
  24.   # К псевдонимам, созданным внутри составных инструкций, нельзя обратиться.
  25.   echo "Однако, ранее созданный псевдоним остается работоспособным:"
  26.   ll /usr/X11R6/bin/mk*
  27. fi
  28. echo
  29. count=0
  30. while [ $count -lt 3 ]
  31. do
  32.   alias rrr="ls -l"
  33.   echo "Попытка обращения к псевдониму \"rrr\", созданному внутри цикла \"while\":"
  34.   rrr /usr/X11R6/bin/mk*   #* Так же возникает ошибка.
  35.                            #  alias.sh: line 57: rrr: command not found
  36.   let count+=1
  37. done
  38. echo; echo
  39. alias xyz='cat $0'   # Сценарий печатает себя самого.
  40.                      # Обратите внимание на "строгие" кавычки.
  41. xyz
  42. #  Похоже работает,
  43. #+ хотя документация Bash утверждает, что такой псевдоним не должен работать.
  44. #
  45. #  Steve Jacobson отметил, что
  46. #+ параметр "$0" интерпретируется непосредственно, во время объявления псевдонима.
  47. exit 0

Команда unalias удаляет псевдоним, объявленный ранее .

Пример 23-2. unalias: Объявление и удаление псевдонимов

  1. #!/bin/bash
  2. shopt -s expand_aliases  # Разрешить "разворачивание" псевдонимов.
  3. alias llm='ls -al | more'
  4. llm
  5. echo
  6. unalias llm              # Удалить псевдоним.
  7. llm
  8. # Сообщение об ошибке, т.к. команда 'llm' больше не распознается.
  9. exit 0
  1. bash$ ./unalias.sh
  2. total 6
  3. drwxrwxr-x    2 bozo     bozo         3072 Feb  6 14:04 .
  4. drwxr-xr-x   40 bozo     bozo         2048 Feb  6 14:04 ..
  5. -rwxr-xr-x    1 bozo     bozo          199 Feb  6 14:04 unalias.sh
  6. ./unalias.sh: llm: command not found

[54]    Однако, псевдонимы могут "раскручивать" позиционные параметры.