Разделить оболочку по горизонтали, чтобы отобразить ls -al и pwd

Ваша стратегия именования кажется прекрасной. В моем отделе в университете диски экспортируются так же как:

/machine-name/s0
/machine-name/s1
/machine-name/s2

ко всем другим локальным машинам. Это - по существу та же схема именования, которую Вы предлагаете.

Одной вещью, которую необходимо будет рассмотреть, хотите ли Вы получить доступ к Вам NAS от нескольких машин, является непротиворечивость идентификатора пользователя через машины. Samba может заботиться об этом для клиентов окон, но для клиентов Linux Вы, вероятно, захотите синхронизировать идентификаторы пользователей через поля. Мой опыт с этим состоит в том, чтобы использовать NIS, но существуют другие (LDAP, ручное слияние passwd/shadow/group, и т.д.) пути.

2
23.05.2015, 08:18
2 ответа

Ваш вариант использования не очень убедителен. Большинство людей включают текущий каталог как часть приглашения; zsh имеет чрезвычайно широкие возможности настройки подсказок (включая многострочные подсказки, левые и правые подсказки и т. д.). С завершением (который снова в zsh очень настраиваемый) вы можете отображать списки файлов в тех контекстах, где они вам нужны. При этом есть способы достичь того, что вы описываете, но ни один из них не является одновременно простым и приятным.

Только с оболочкой

Оболочка управляет только своим собственным вводом и выводом. Когда вы выполняете команду, оболочка ничего не контролирует. Если вы хотите зарезервировать часть терминала для таких вещей, как вывод ls , вам потребуется сотрудничество с терминалом. В чем точная разница между «терминалом», «оболочкой», «tty» и «консолью»? может быть полезным справочным материалом.

На некоторых терминалах можно определить прокручиваемую область; то, что находится за пределами прокручиваемой области, остается на месте. Я знаю, что xterm поддерживает эту функцию, но не знаю, поддерживают ли другие популярные эмуляторы терминала. Вот доказательство концепции bash для отображения вывода date , pwd и ls в нижней трети терминала.

reset () {
  tput reset
  scrollable_lines=$((LINES*2/3))
  tput csr 0 $((scrollable_lines-1))
} 
update_status () {
  tput sc
  tput cup $((scrollable_lines+2)) 0
  tput ed
  date
  pwd
  ls -x --color=always | head -n $((LINES-scrollable_lines-3))
  tput rc
}
PROMPT_COMMAND='update_status'
reset

Несколько слов пояснения:

  • Команда tput отправляет на терминал управляющие последовательности , полученные через terminfo .
  • Вызов tput csr определяет область прокрутки до верхних 2/3 строк.
  • Функция сброса должна выполняться при сбросе терминала, потому что сброс терминала сбрасывает область прокрутки, чтобы она была всем терминалом.
  • tput sc сохраняет позицию курсора для восстановления позже с помощью tput rc .
  • tput cup перемещает курсор в верхнюю часть области без прокрутки. tput ed стирает то, что уже есть.
  • Функция update_status выполняется каждый раз, когда bash собирается отобразить новое приглашение.

Я пробовал это в zsh, но он взаимодействует с терминалом больше, чем bash, поэтому даже проверка концепции требует дополнительной настройки.

С терминальным мультиплексором

Оба Экран и Tmux могут разделить терминал на несколько подокон (Экран называет их регионами, tmux называет их панелями). Вы можете запустить мультиплексор, запустить свою оболочку в верхнем окне и заставить ее запускать другие вещи в нижнем окне.

Легко вызвать что-то в оболочке, чтобы что-то отображалось в нижнем окне: просто перенаправьте вывод на правое оконечное устройство. Громоздкая часть здесь - получить имя устройства и держать нижнее окно открытым столько, сколько необходимо, но не дольше.

Вот доказательство концепции с использованием zsh и screen. Выполнить screen -c ~ / etc / split.screenrc где ~ / etc / split.screenrc содержит

escape ^\\\
hardstatus off
split
focus
resize 10
screen ~/bin/bottom_tty
focus
screen zsh

Это создает 10-строчную нижнюю область, в которой запускается программа ~ / bin / bottom_tty и запускает zsh в верхней области.В ~ / bin / bottom_tty получите несколько параметров, затем спите навсегда:

#!/bin/sh
cat <<EOF >~/.split-screen.$PPID.tmp
bottom_tty=$(tty)
bottom_lines=$(tput lines)
bottom_pid=$$
EOF
mv ~/.split-screen.$PPID.tmp ~/.split-screen.$PPID
while true; do sleep 999999999; done

В .zshrc прочтите информацию и настройте пару вещей:

  • Каждый раз отображается запрос, запустите refresh_bottom_tty , чтобы обновить содержимое нижней области.
  • Когда zsh завершает работу, завершите программу в нижней области, чтобы сценарий завершился.
refresh_bottom_tty () {
  printf %s $terminfo[clear]
  date
  pwd
  ls -x --color | head -n $((bottom_lines-2))
}
precmd () {
  refresh_bottom_tty <>$bottom_tty 1>&0 2>&0
}
zshexit () {
  kill -HUP -$bottom_pid
}

while [[ ! -e ~/.split-screen.$PPID ]]; do
  sleep 1
done
. ~/.split-screen.$PPID
rm ~/.split-screen.$PPID

Выделенная оболочка терминала

Можно было бы выполнять гораздо лучшую и надежную работу с помощью специальной оболочки, которая понимает, что вы хотите с ней делать. Оболочка будет определять виртуальный терминал, в котором выполняется оболочка, и будет интерфейс, позволяющий оболочке обновлять то, что отображается за пределами виртуального терминала.

Экран и tmux на самом деле довольно близки к обеспечению необходимой функциональности через строку состояния. Однако оба ограничены одной строкой состояния. Если бы они были расширены для поддержки многострочных строк состояния, вы могли бы отображать там все, что хотите.

В качестве альтернативы вы можете использовать модуль zpty для написания специальной оболочки. Тогда будет два экземпляра zsh: один для оболочки, другой для выполнения команд. Получение даже доказательства концепции - это больше кода, чем я хотел бы написать в этом ответе.

2
27.01.2020, 22:05

То, что вы просите, кажется, не имеет смысла.

Здесь я хочу получить root, потому что удаленный пользователь теперь root

Нет, удаленный пользователь теперь root. Тот факт, что вы сделали sudo-s в локальной системе, не меняет того, что вы находитесь в soyuka аккаунт удаленно.

Ответ на «Here I want to get/home/soyuka/downloads» аналогичен.

Возможно ли как-то выполнить команду для текущего ssh-сеанса с помощью сокета?

Я считаю, что у вас может быть неправильное представление о том, что существует какой-либо постоянный долгоживущий SSH-сеанс. Фактически, каждый раз, когда вы делаете:

ssh -l remoteuser host some-command

... открывается новый SSH-сеанс, в этом сеансе выполняется some-command (без pty, в отличие от SSH-сеансов, открытых без указанной удаленной команды), и затем этот сеанс закрывается.

Даже если бы был такой постоянный удаленный сеанс, нет причин ожидать, что выполнение действий локально, таких как sudo или cd , повлияет на этот удаленный сеанс в любом пути.

Тот факт, что вы используете разъемы управления SSH, это совсем не меняет. Единственное, что отличается в сеансе SSH раба по сравнению с обычным, это то, что сеанс SSH подключен к существующему соединению SSH вместо совершенно нового соединения.

-121--209812-

Необходимо записать в BIOS, Предположим, вы хотите изменить последовательности даты на следующую последовательность:

root@debian:/home/mohsen# date -s "Sat May 23 18:56:59 IRDT 2015"
root@debian:/home/mohsen# hwclock -w

Первая строка, которую вы устанавливаете дата, но вы должны записать в bios, во второй строке с hwclock -w вы записываете свое время в bios.

-121--229461-

Я не знаю about showins ls вывод, но zsh имеет nifty функцию RPROMPT . Поместите это в .zshrc и проверьте, соответствует ли оно вашим потребностям:

PROMPT=$'%n@%m\n%! %% '
RPROMPT='# %d'

Это помещает текущий рабочий каталог в правую часть подсказки для меня. Я включаю пример PROMPT с новой строкой, так что если RPROMPT не работает так, как вы хотите, вы можете увидеть, как поместить «% d» в значение PROMPT , чтобы он мог находиться в собственной строке.

1
27.01.2020, 22:05

Теги

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