
Я перешел на fish
shell и вполне доволен. Я не понял, как мне обрабатывать булевы значения. Мне удалось написать, config.fish
что выполняется tmux
на ssh
(см.:Как автоматически запустить tmux в fish shell при подключении к удаленному серверу через ssh?) соединение, но меня не устраивает читаемость кода и я хочу узнать больше о fish
оболочке (я уже прочитал учебник и просмотрел справочную информацию). Я хочу, чтобы код выглядел так (я знаю, что синтаксис неверный, я просто хочу показать идею):
set PPID (ps --pid %self -o ppid --no-headers)
if ps --pid $PPID | grep ssh
set attached (tmux has-session -t remote; and tmux attach-session -t remote)
if not attached
set created (tmux new-session -s remote; and kill %self)
end
if !\(test attached -o created\)
echo "tmux failed to start; using plain fish shell"
end
end
Я знаю, что я могу хранить $status
es и сравнивать их с test
целыми числами, но я думаю, что это уродливо и еще более нечитаемо. Так что проблема в том, чтобы повторно использовать $status
es и использовать их в if
и test
.
Как мне добиться чего-то подобного?
решение1
Вы можете структурировать это как цепочку if/else. Можно (хотя и громоздко) использовать begin/end, чтобы поместить составной оператор в условие if:
if begin ; tmux has-session -t remote; and tmux attach-session -t remote; end
# We're attached!
else if begin; tmux new-session -s remote; and kill %self; end
# We created a new session
else
echo "tmux failed to start; using plain fish shell"
end
Более удобный стиль — это булевы модификаторы. begin/end заменяют скобки:
begin
tmux has-session -t remote
and tmux attach-session -t remote
end
or begin
tmux new-session -s remote
and kill %self
end
or echo "tmux failed to start; using plain fish shell"
(Первое начало/конец не обязательно, но, на мой взгляд, улучшает ясность.)
Третья возможность — разложение функций на множители:
function tmux_attach
tmux has-session -t remote
and tmux attach-session -t remote
end
function tmux_new_session
tmux new-session -s remote
and kill %self
end
tmux_attach
or tmux_new_session
or echo "tmux failed to start; using plain fish shell"