Это самое короткое решение, которое я смог придумать:
Учитывая эти функции:
# List processing
map() { while IFS='' read -r x; do "$@" "$x"; done; }
filter() { while IFS='' read -r x; do "$@" "$x" >&2 && echo "$x"; done; }
foldr() { local f="$1"; local result="$2"; shift 2; while IFS='' read -r x; do result="$( "$f" "$@" "$x" "$result" )"; done; echo "$result"; }
foldl() { local f="$1"; local result="$2"; shift 2; while IFS='' read -r x; do result="$( "$f" "$@" "$result" "$x" )"; done; echo "$result"; }
# Helpers
re() { [[ "$2" =~ $1 ]]; }
Примеры:
# Example helpers
toLower() { tr '[:upper:]' '[:lower:]'; }
showStructure() { [[ "$1" == "--curly" ]] && echo "{$2; $3}" || echo "($1, $2)"; }
# All lib* directories, ignoring case, using regex
ls /usr | map toLower | filter re 'lib.*'
# All block devices. (Using test, for lack of a full bash [[ … ]].)
cd /dev; ls | filter test -b
# Show difference between foldr and foldl
$ ls / | foldr showStructure '()'
(var/, (usr/, (tmp/, (sys/, (sbin/, (run/, (root/, (proc/, (opt/, (mnt/, (media/, (lost+found/, (lib64/, (lib32/, (lib@, (home/, (etc/, (dev/, (daten/, (boot/, (bin/, ())))))))))))))))))))))
$ ls / | foldr showStructure '{}' --curly
{var/; {usr/; {tmp/; {sys/; {sbin/; {run/; {root/; {proc/; {opt/; {mnt/; {media/; {lost+found/; {lib64/; {lib32/; {lib@; {home/; {etc/; {dev/; {daten/; {boot/; {bin/; {}}}}}}}}}}}}}}}}}}}}}}
(Эти примеры, конечно, просто примеры использования, и в реальности этот стиль имеет смысл только для более сложных случаев использования)
Вообще, всегда можно использовать следующий стиль:
f() { something "$@" ; }; someList | map f
g() { something "$1" "$2" …; }; someCommand | filter g
⋮ ⋮ ⋮ ⋮
Это не совсем лямбда, но очень очень близко. Только несколько лишних символов.
Но любое из следующих удобных сокращений не работает, насколько я могу судить:
λ() { [[ $@ ]]; } # fails on spaces
λ() { [[ "${@:-1}" ${@:1:-1} ]]; } # syntax error
alias λ=test # somehow ignored
К сожалению, bash
не очень хорошо подходит для этого стиля, хотя некоторые его функции имеют очень функциональный стиль.
Nemo использует конфигурацию gsettings. Это восстановило предполагаемое поведение:
$ gsettings set org.gnome.desktop.default-applications.terminal exec gnome-terminal
В Ubuntu по какой-то причине все по-другому:
$ gsettings set org.cinnamon.desktop.default-applications.terminal exec gnome-terminal
Google привел меня сюда, поэтому я возобновляю эту ветку в надежде избавить хотя бы одного человека от нескольких ненужных головных болей.
Я использую Debian, и предложение Джеймса, приведенное выше, для меня не сработало. Итак, я взглянул на исходный код Nemo и в nemo-global-preferences.c обнаружил, что (восходящая) схема конфигурации выглядит следующим образом:
org.cinnamon.desktop.default-applications .terminal
Я использую Nemo вместо Nautilus, и поскольку я использую Gnome3 вместо Cinnamon, для меня этой схемы даже не существовало. После выполнения следующей команды действие «Открыть в терминале» открывает оболочку gnome в правильном каталоге.
$ gsettings set org.cinnamon.desktop.default-applications.terminal exec gnome-shell
В Xubuntu 18.10 это помогает мне (Я использую сакуру в качестве терминала):
$ gsettings set org.cinnamon.desktop.default-applications.terminal exec sakura
Найдите и откройте «Предпочитаемое приложение» в главном меню.
Выберите «Терминатор» в диалоговом окне «Предпочитаемое приложение».
Терминатор будет установлен в качестве терминального приложения по умолчанию для системы.
CTRL + ALT + T
", чтобы открыть терминал. Все они откроют Terminator или терминал по умолчанию, который вы установили.
Сначала установите клемму X по умолчанию:
sudo update-alternatives --config x-terminal-emulator
Затем вы можете установить терминал по умолчанию для Cinnamonx-terminal-emulator
(Nemo — это файловый менеджер Cinnamon, поэтому он берет свои настройки из конфигурации Cinnamon):
gsettings set org.cinnamon.desktop.default-applications.terminal exec x-terminal-emulator
Теперь ваша среда рабочего стола (, например Gnome )и приложения Cinnamon, будут использовать один и тот же терминал, и если вы в будущем используете первую команду для изменения терминала X, ваши приложения Cinnamon также должны использовать этот новый терминал..
В случае, если вы хотите не заменить, а добавить «Открыть в Terminator» в контекстное меню -,
перейти в папку /home/$USER/.local/share/nemo/actions
,
создать open_in_terminator.nemo_action
файл:
[Nemo Action]
Name=Open in Terminator
Comment=Open the 'terminator' terminal in the selected folder
Exec=terminator --working-directory="%F"
Icon-Name=terminator
Selection=any
Extensions=dir;
Не забывайте двойные кавычки(""
)вокруг "%F"
, иначе действие «Открыть в терминаторе» не будет работать из любой папки, в пути которой есть пробелы.
Забрел в эту старую ветку, могу добавить свой конфиг, по состоянию на 2020 . Настройки для моей системы были почти идентичны:
org.cinnamon.desktop.applications.terminal
У меня нет части default-
.