Type a bash что это
В отличие от большинства других языков программирования, Bash не производит разделения переменных по «типам» . По сути, переменные Bash являются строковыми переменными, но, в зависимости от контекста, Bash допускает целочисленную арифметику с переменными. Определяющим фактором здесь служит содержимое переменных.
Пример 4-4. Целое число или строка?
#!/bin/bash # int-or-string.sh: Целое число или строка? a=2334 # Целое число. let "a += 1" echo "a = $a " # a = 2335 echo # Все еще целое число. b=$ # замена "23" на "BB". # Происходит трансформация числа в строку. echo "b = $b" # b = BB35 declare -i b # Явное указание типа здесь не поможет. echo "b = $b" # b = BB35 let "b += 1" # BB35 + 1 = echo "b = $b" # b = 1 echo c=BB34 echo "c = $c" # c = BB34 d=$ # замена "BB" на "23". # Переменная $d становится целочисленной. echo "d = $d" # d = 2334 let "d += 1" # 2334 + 1 = echo "d = $d" # d = 2335 echo # А что происходит с "пустыми" переменными? e="" echo "e = $e" # e = let "e += 1" # Арифметические операции допускают использование "пустых" переменных? echo "e = $e" # e = 1 echo # "Пустая" переменная становится целочисленной. # А что происходит с необъявленными переменными? echo "f = $f" # f = let "f += 1" # Арифметические операции допустимы? echo "f = $f" # f = 1 echo # Необъявленная переменная трансформируется в целочисленную. # Переменные Bash не имеют типов. exit 0
Отсутствие типов — это и благословение и проклятие. С одной стороны — отсутствие типов делает сценарии более гибкими (чтобы повеситься — достаточно иметь веревку!) и облегчает чтение кода. С другой — является источником потенциальных ошибок и поощряет привычку к «неряшливому» программированию.
Бремя отслеживания типа той или иной переменной полностью лежит на плечах программиста. Bash не будет делать это за вас!
| Назад | К началу | Вперед |
| Присваивание значений переменным | Наверх | Специальные типы переменных |
Type a bash что это
переменные, область видимости которых ограничена блоком кода или телом функции (см так же локальные переменные в функциях)
переменные, которые затрагивают командную оболочку и порядок взаимодействия с пользователем
В более общем контексте, каждый процесс имеет некоторое «окружение» (среду исполнения), т.е. набор переменных, к которым процесс может обращаться за получением определенной информации. В этом смысле командная оболочка подобна любому другому процессу.
Каждый раз, когда запускается командный интерпретатор, для него создаются переменные, соответствующие переменным окружения. Изменение переменных или добавление новых переменных окружения заставляет оболочку обновить свои переменные, и все дочерние процессы (и команды, исполняемые ею) наследуют это окружение.
Пространство, выделяемое под переменные окружения, ограничено. Создание слишком большого количества переменных окружения или одной переменной, которая занимает слишком большое пространство, может привести к возникновению определенных проблем.
bash$ bash$ du bash: /usr/bin/du: Argument list too long
(Спасибо S. C. за вышеприведенный пример и пояснения.)
Специальные переменные $* и $@ содержат все позиционные параметры (аргументы командной строки).
Пример 4-5. Позиционные параметры
#!/bin/bash # Команда вызова сценария должна содержать по меньшей мере 10 параметров, например # ./scriptname 1 2 3 4 5 6 7 8 9 10 MINPARAMS=10 echo echo "Имя файла сценария: \"$0\"." # Для текущего каталога добавит ./ echo "Имя файла сценария: \"`basename $0`\"." # Добавит путь к имени файла (см. 'basename') echo if [ -n "$1" ] # Проверяемая переменная заключена в кавычки. then echo "Параметр #1: $1" # необходимы кавычки для экранирования символа # fi if [ -n "$2" ] then echo "Параметр #2: $2" fi if [ -n "$3" ] then echo "Параметр #3: $3" fi # . if [ -n "$" ] # Параметры, следующие за $9 должны заключаться в фигурные скобки then echo "Параметр #10: $" fi echo "-----------------------------------" echo "Все аргументы командной строки: "$*"" if [ $# -lt "$MINPARAMS" ] then echo echo "Количество аргументов командной строки должно быть не менее $MINPARAMS !" fi echo exit 0
args=$# # Количество переданных аргументов. lastarg=$ # Обратите внимание: lastarg=$ неприменимо.
В сценарии можно предусмотреть различные варианты развития событий, в зависимости от имени сценария. Для этого сценарий должен проанализировать аргумент $0 — имя файла сценария. Это могут быть и имена символических ссылок на файл сценария.
Если сценарий ожидает передачи аргументов в командной строке, то при их отсутствии он получит «пустые» переменные, что может вызвать нежелательный побочный эффект. Один из способов борьбы с подобными ошибками — добавить дополнительный символ в обеих частях операции присваивания, где используются аргументы командной строки.
variable1_=$1_ # Это предотвратит появление ошибок, даже при отсутствии входного аргумента. critical_argument01=$variable1_ # Дополнительные символы всегда можно "убрать" позднее. # Это может быть сделано примерно так: variable1=$ # Побочный эффект возникает только если имя переменной # $variable1_ будет начинаться с символа "_". # Здесь используется один из вариантов подстановки параметров, обсуждаемых в Главе 9. # Отсутствие шаблона замены приводит к удалению. # Более простой способ заключается #+ в обычной проверке наличия позиционного параметра. if [ -z $1 ] then exit $POS_PARAMS_MISSING fi
#!/bin/bash # Команда 'whois domain-name' выясняет имя домена на одном из 3 серверов: # ripe.net, cw.net, radb.net # Разместите этот скрипт под именем 'wh' в каталоге /usr/local/bin # Требуемые символические ссылки: # ln -s /usr/local/bin/wh /usr/local/bin/wh-ripe # ln -s /usr/local/bin/wh /usr/local/bin/wh-cw # ln -s /usr/local/bin/wh /usr/local/bin/wh-radb if [ -z "$1" ] then echo "Порядок использования: `basename $0` [domain-name]" exit 65 fi case `basename $0` in # Проверка имени скрипта и, соответственно, имени сервера "wh" ) whois $1@whois.ripe.net;; "wh-ripe") whois $1@whois.ripe.net;; "wh-radb") whois $1@whois.radb.net;; "wh-cw" ) whois $1@whois.cw.net;; * ) echo "Порядок использования: `basename $0` [domain-name]";; esac exit 0
Команда shift «сдвигает» позиционные параметры, в результате чего парметры «сдвигаются» на одну позицию влево.
Прежний аргумент $1 теряется, но аргумент $0 (имя файла сценария) остается без изменений . Если вашему сценарию передается большое количество входных аргументов, то команда shift позволит вам получить доступ к аргументам, с порядковым номером больше 9, без использования .
Пример 4-7. Использование команды shift
#!/bin/bash # Использование команды 'shift' с целью перебора всех аргументов командной строки. # Назовите файл с этим сценарием, например "shft", #+ и вызовите его с набором аргументов, например: # ./shft a b c def 23 skidoo until [ -z "$1" ] # До тех пор пока не будут разобраны все входные аргументы. do echo -n "$1 " shift done echo # Дополнительная пустая строка. exit 0
Примечания
Аргумент $0 устанавливается вызывающим процессом. В соответствии с соглашениями, этот параметр содержит имя файла скрипта. См. страницы руководства для execv (man execv).
| Назад | К началу | Вперед |
| Переменные Bash не имеют типа | Наверх | Кавычки |
12. bash №1: bash-completion, alias, type
В теме «Текстовый интерфейс пользователя» я рассказал про интерпретатор командной строки bash. Давайте разберём, что же он умеет.

Тогда я упомянул, что bash умеет дополнять команды – допустим, вы пишете часть команды ( to, tou, touch file), нажимаете tab и bash дописывает команду или файл за вас. Если вариантов несколько – нажимаете tab два раза и видите все варианты. Но есть два типа дополнения – простое и продвинутое. В случае простого дополнения у вас просто дописывается сама команда или файл. Продвинутое дополнение может добавлять опции и значения.

Мы с вами на виртуалке поставили CentOS с графическим интерфейсом, то есть user-friendly версию, поэтому у нас сейчас стоит продвинутое дополнение. Из пройденных команд это можно увидеть по команде man – если написать man и нажать два раза tab, то bash скажет, что у нас больше 6 тысяч вариантов – всё это страницы документации, то есть, значения для man. Или, например, команда для архивации — tar – о ней мы поговорим в другой раз. Но, с точки зрения дополнения, если написать tar и нажать tab, то сперва появится дефис, а после двух нажатий tab появятся опции этой команды. В отличии от пройденных команд, где всякие ключи не обязательны, у tar ключи обязательны, поэтому bash сразу предлагает их написать.

Теперь давайте рассмотрим простой вариант дополнения. Обычно, когда стоит минимальная система без графического интерфейса, дополнение простое. Функционал продвинутого дополнения ставится с пакетом bash-completion. Давайте я удалю этот пакет и мы посмотрим что будет. Для этого я пишу:
sudo dnf -y remove bash-completion
и ввожу пароль моего пользователя. В рамках запущенной bash сессии ничего не изменится, но если открыть новое окно терминала – то тут у нас дополнение будет работать в урезанном виде. Например, пишу man, нажимаю tab — а он мне предлагает файлы вместо страниц документации. Или пишу tar, нажимаю tab – опять же файлы. Сами команды и файлы будут дописываться — если написать to и два раза нажать tab, то мы увидим все команды, начинающиеся на эти буквы. Но сразу после команд при нажатии tab будут предлагаться файлы, и не важно, работает команда с файлами или нет. Поэтому установим обратно bash-completion:
sudo dnf -y install bash-completion

Ещё в bash можно настроить алиасы. Алиасы дают возможность настроить какие-то свои команды на основе других. Если запустить команду
alias
можно увидеть список заданных алиасов для текущей bash сессии.
Я говорю bash сессия, но что это такое? Когда вы запускаете эмулятор терминала, у вас запускается bash сессия. Если вы запустите другое окно – будет другая сессия. Напишете bash – ещё одна сессия. Для каждой сессии bash запускается «с нуля», то есть он считывает файл настроек. Это значит, что если вы измените файл настроек, то в запущенном bash-е ничего не изменится. Но если написать bash или запустить новое окно, то есть запустить новую сессию bash, то новая сессия эти изменения увидит. Сейчас, на примере алиасов, разберёмся.

Так вот, команда alias показала нам текущие алиасы. Тут мы видим пару знакомых команд, связанных с ls и vi. Итак, здесь написано, что команда l точка (l.) — это на самом деле команда ls -d .* –сolor=auto. ls показывает список файлов и директорий в текущей директории, ключ -d покажет сами директории, а не их содержимое, .* — все файлы и директории, у которых в начале названия есть точка, то есть скрытые файлы и директории. И –color=auto – раскрасить вывод. Так вот, если написать:
мы увидим все скрытые файлы и директории в текущей директории. Если вы обратили внимание, у нас ls в принципе всегда раскрашивает вывод – а это потому что есть алиас на сам ls c опцией –color=auto. Тут же есть алиас на vi – то есть когда мы запускаем vi у нас запускается vim.

Давайте сами зададим какой-нибудь alias. Например:
alias vi=nano
Теперь у нас при запуске vi будет открываться nano – vi file. Или, допустим:
alias show="tail -5 /etc/passwd"
Обратите внимание, что я взял правую часть в кавычки, а в примере с nano я этого не делал. Сами подумайте, почему, если не знаете – попробуйте ввести без кавычек и проверить. Ну и если вам пока это сложно понять – спрашивайте в комментариях, я отвечу. Так вот, чуть ранее я говорил про bash сессии. И те алиасы, которые мы создали, сохранились только в текущей сессии. Это значит, что если запустить новое окно – то там наших алиасов уже не будет.

Если мы хотим, чтобы наши алиасы остались навсегда, мы должны их написать в файле настроек bash — ~/.bashrc, который находится у нас в домашней директории:
nano ~/.bashrc
Как вы видите, этот файл не пустой, здесь есть какие-то настройки. Некоторые строчки начинаются со знака решётки (#). Такие строчки называются закомментированными – как правило, программы такие строчки не считывают, они больше нужны для людей.

Обычно без разницы, где добавлять новые строчки, но для удобства давайте спустимся в самый низ и добавим там. Напишем комментарий:
# My custom aliases
Кстати, в nano можно нажать Esc+3 и nano сам добавит или уберёт знак решётки с текущей строки. Дальше я пишу свои алиасы, по одному на каждую строку:
alias show="grep user /etc/passwd"
и закрываю файл. В текущей баш сессии ничего не изменится, поэтому я запускаю новое окно и уже там эти алиасы видны и работают.

Алиасы нужны пользователям для упрощения работы, бывают сложные и длинные команды, которые вы часто должны вбивать. И чтобы облегчить себе жизнь, вы можете создать для себя алиасы. Но бывают случаи, когда вам нужен не алиас, а сама команда. Допустим, в системе есть алиас вместо vi запускать vim, или окрашивать вывод ls. А что, если мне нужно разок запустить обычный ls? Есть несколько способов это сделать – поставить обратный слэш перед командой — \ls, либо взять команду в кавычки – «ls», либо написать перед ней command — command ls.

Кстати, как вы, возможно, заметили, список алиасов от команды alias не малый, но в файле ~/.bashrc их не было. Файл .bashrc распространяется только на моего пользователя, потому что он в моей домашней директории. Но есть файл /etc/bashrc, который распространяется на всех пользователей в системе. Допустим, если вы хотите создать alias, который бы работал у всех пользователей – создаёте его именно в этом файле. Но, если полистать этот файл, вы всё равно не найдёте те же алиасы на ls. Поэтому ещё одна задачка для вас – постарайтесь найти файл, в котором указаны алиасы, которые у нас есть по умолчанию. Всё что нужно чтобы найти – мы уже проходили.

Мы разобрались, что bash может запускать как команды, так и алиасы. Сами команды можно разделить на 2 типа – внешние и внутренние. Какие-то команды встроены в bash, они называются внутренними – например, тот же cd. Но большинство команд лежат на файловой системе в специальных директориях и называются внешними. Чтобы как-то отличать, что это за команда – внутренняя, внешняя или алиас – есть команда type. Допустим:
type ls type mkdir type cd
В случае ls – это алиас, в случае mkdir bash показывает путь к программе, то есть это внешняя программа, а в случае с cd bash говорит, что это встроенная в оболочку команда. Но ведь ls – это алиас сам на себя, как понять, что там стоит за этим алиасом? Для этого можно использовать type с опцией -a:
type -a ls
Теперь мы видим, что ls – это /usr/bin/ls – то есть внешняя программа.
И так, мы узнали, что у нашего интерпретатора командной строки — bash – есть дополнения – простые и продвинутые. Также мы поговорили про алиасы, внутренние и внешние программы. Но bash может делать гораздо больше, поэтому будет несколько тем, посвящённых bash.
© Авторские права 2021, GNU Linux Pro, CC-BY-SA-4.0. Ревизия b16e73a6 .
Команда Type в Linux


Добавить в избранное

В этой статье мы рассмотрим команду type в Linux.
Команда type используется для отображения информации о типе команды. Он покажет вам, как команда будет интерпретироваться, если вводится в командной строке.
Как использовать команду type
Синтаксис команды type следующий:
type [OPTIONS] FILE_NAME.
Например, чтобы найти тип команды wc , вы должны ввести следующее:
type wc
Результат будет примерно таким:
wc is /usr/bin/wc
Вы также можете указать несколько аргументов команды type:
type sleep head
Вывод будет содержать информацию о командах sleep и head:
sleep is /bin/sleep head is /usr/bin/head
Типы команд
Опция -t указывает type печатать одно слово, описывающее тип команды, которое может быть одним из следующих:
- псевдоним (псевдоним оболочки)
- функция (функция оболочки)
- встроенный (встроенный в оболочку)
- файл (файл на диске)
- ключевое слово (зарезервированное слово оболочки)
Вот несколько примеров:
type -t grep
В нашей системе grep есть псевдоним grep —color=auto:
alias
type -t rvm
rvm это инструмент (функция) для установки, управления и работы с несколькими средами Ruby:
function
type -t echo
echo это оболочка, встроенная в Bash и другие оболочки, такие как Zsh и Ksh:
builtin
type -t cut
cut это исполняемый файл:
builtin
type -t for
for это зарезервированное слово в Bash:
keyword
Показать все места, которые содержат команду
Чтобы распечатать все совпадения, используйте опцию -a:
type -a pwd
Вывод покажет вам, что pwd это встроенная оболочка, но она также является переменной как отдельный исполняемый файл /bin/pwd:
pwd is a shell builtin pwd is /bin/pwd
Когда используется опция -a, команда type будет включать псевдонимы и функции, только если опция -p не используется.
Другие параметры команды type
Опция -p заставит type вернуть путь к команде только если команда является исполняемым файлом на диске:
Например, следующая команда не будет отображать никаких выходных данных, потому что команда pwd является встроенной оболочкой.
type -p pwd
В отличие от этого -p, опция -P в верхнем регистре указывает type искать ПУТЬ исполняемого файла на диске, даже если команда не является файлом.
type -P pwd
pwd is /bin/pwd
Когда используется опция -f, type не будет искать функции оболочки, как с помощью встроенной команды.
Заключение
Команда type покажет вам, как будет интерпретироваться определенная команда, если она используется в командной строке.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.