на каком языке написан bashrc

Введите nmtuiна терминале; появится всплывающее окно -, в котором вы можете установить SSI и BSSID в соединении WiFi.

-6
17.05.2021, 12:52
2 ответа

Содержимое .bashrcвыполняется самим Bash точно так же, как он выполняет скрипты или что-либо, что когда-либо загружается в интерактивную оболочку. Это вариант языка оболочки POSIX с рядом расширений (, некоторые из которых заимствованы из других оболочек, в основном Ksh, некоторые созданы самим Bash ).

Здесь function cd_up() {... ; }определяет функцию. Стандартной формой для этого будет просто cd_up() {... ; }без ключевого слова function. $(...)- это подстановка команды, она запускает команду внутри и помещает ее вывод в качестве аргументов командной строки.

printf "%0.s../"— это хитрость. printfпринимает строку формата, аналогичную функции C printf(), и ряд аргументов для печати с использованием этой строки формата. Важно отметить, что она также повторяет строку формата столько раз, сколько необходимо для использования всех аргументов (, которые функция C не использует и не может использовать ). Спецификатор %0.sпредписывает печатать аргумент в виде строки с нулевой шириной, поэтому на самом деле аргументы печатаются , а не .

Но постоянная часть../печатается один раз для каждого аргумента, что означает, что printf "%0.s../" a bбудет печатать его дважды и т. д. $(seq 1 $1)— это еще одна подстановка команды, и поскольку seqпечатает список чисел, он используется для предоставления необходимого количества аргументов для printf. $1— первый аргумент текущей функции cd_up.

Итак, напр. cd_up 2, сначала запустит seq 1 2, что напечатает 1 2. Это передается в качестве аргумента printf, поэтому вы получаете printf "%0.s../" 1 2, который печатает ../../. Это передается в cd, и cd../../запускается, поднимаясь на два уровня вверх в дереве каталогов.

С помощью set -xвы можете увидеть команды, которые на самом деле выполняет оболочка. Bash даже указывает уровень вложенности с помощью знаков +:

/tmp/foo$ set -x
/tmp/foo$ cd_up 2
+ cd_up 2
+++ seq 1 2
++ printf %0.s../ 1 2
+ cd../../
/$

Обратите внимание, что на самом деле не имеет значения какой вывод seq, важно лишь то, что в нем правильное количество слов. Поскольку подстановки команд не заключены в кавычки, вывод проходит через разбиение на слова ,это означает, что он разделен пробелами на несколько аргументов. printf "%0.s../" "$(seq 1 $1)"всегда будет передавать только один аргумент после строки формата. (См. примеры на связанной странице.)


Другой способ написать подобную функцию с меньшими хитростями — это простой цикл. Почти в POSIX sh(localне является POSIX):

cd_up() {
   local i=$1 
   while [ "$i" -gt 0 ]; do 
      cd..
      i=$((i - 1))
   done
}

или в Bash/Zsh, используя арифметический цикл for:

cd_up() { 
    local i
    for (( i=$1; i > 0; i-- )); do 
        cd..
    done
}

Хотя версия с printfлучше тем, что она запускает cdтолько один раз, поэтому cd -возвращается обратно в исходный каталог, а не в -между ними. (Исправление, оставленное в качестве упражнения.)

Ресурс по языку оболочки см., например.

7
28.07.2021, 11:31

bashrc — это сценарий bash, который запускается всякий раз, когда bash запускается в интерактивном режиме.

2
28.07.2021, 11:31

Теги

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