Объявить и использовать специальную -функцию в bash в интерактивной оболочке

Чтобы вывести список всех установленных сред рабочего стола, вы можете использовать команду:

grep "^Exec" /usr/share/xsessions/*

Он вернет список вроде (имя среды рабочего стола следует послеExec=):

~ ⌚ 12:52:29
$ grep "^Exec" /usr/share/xsessions/*
/usr/share/xsessions/awesome.desktop:Exec=awesome
/usr/share/xsessions/bspwm.desktop:Exec=bspwm
/usr/share/xsessions/budgie-desktop.desktop:Exec=/usr/bin/budgie-desktop
/usr/share/xsessions/enlightenment.desktop:Exec=/usr/bin/enlightenment_start
/usr/share/xsessions/gnome-xorg.desktop:Exec=/usr/bin/gnome-session
/usr/share/xsessions/gnome.desktop:Exec=/usr/bin/gnome-session
/usr/share/xsessions/i3-with-shmlog.desktop:Exec=i3-with-shmlog
/usr/share/xsessions/i3.desktop:Exec=i3
/usr/share/xsessions/mate.desktop:Exec=mate-session
/usr/share/xsessions/plasma.desktop:Exec=/usr/bin/startkde
/usr/share/xsessions/xfce.desktop:Exec=startxfce4
-1
08.05.2021, 09:09
1 ответ

Функции определяются в интерактивной bashоболочке так же, как и в bashсценарии оболочки.

Взяв ваш пример за отправную точку:

my_func () { do_stuff "$1" "$2"; }

Вы должны ввести это в командной строке. Затем вызовите (также в командной строке )с

my_func 'something' 'something else' 'a third thing'

Обратите внимание, что вы не объявляете список аргументов, как в таких языках, как C или C++. Функция должна разумно использовать аргументы, которые она получает (, и вы должны документировать использование функции, будет ли она использоваться для более серьезной работы позже ).

Это вызовет do_stuffс первым из трех аргументов, которые я передал в my_func.

Функция, которая делает что-то немного более интересное:

countnames () (
    shopt -s nullglob
    names=(./* )
    printf 'There are %d visible names in this directory\n' "${#names[@]}"
)

Ничто не мешает вам ввести это в интерактивную bashоболочку. Это сделало бы функцию оболочки countnamesдоступной в текущем сеансе оболочки. (Обратите внимание, что я пишу тело функции в под-оболочке((...)). Я делаю это, потому что хочу установить параметр оболочки nullglob, не затрагивая параметры оболочки, установленные в вызывающей оболочке. Массив namesтакже автоматически становится локальным.)

Тестирование:

$ countnames
There are 0 visible names in this directory
$ touch file{1..32}
$ ls
file1  file12 file15 file18 file20 file23 file26 file29 file31 file5  file8
file10 file13 file16 file19 file21 file24 file27 file3  file32 file6  file9
file11 file14 file17 file2  file22 file25 file28 file30 file4  file7
$ countnames
There are 32 visible names in this directory

Или использовать оболочку zshв качестве более сложного помощника для этой функции:

countnames () {
    printf 'There are %d visible names in this directory\n' \
        "$(zsh -c 'set --./*(N); print $#')"
}

Чтобы «не -определить» (удалить )функцию, используйтеunset -f:

$ countnames
There are 3 visible names in this directory
$ unset -f countnames
$ countnames
bash: countnames: command not found
2
28.07.2021, 11:34

Теги

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