Чтобы вывести список всех установленных сред рабочего стола, вы можете использовать команду:
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
Функции определяются в интерактивной 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