Как я предотвращаю просто 'выход' от того, чтобы быть сохраненным, когда я закрываю соединение SSH?

[

] Я запустил Ubuntu 14.04 и должен был сделать 1 дополнительный шаг сверху по предложению MiGrieves, о котором я бы прочитал здесь - []https://askubuntu.com/a/387313[]. Короче говоря, мне нужно было зайти в "Правка -> Параметры профиля -> Название и Команда" и в выпадающем меню выбрать "Сохранить начальное название". Однако в поле "Начальное название" я оставил "Терминал"[

].

1
04.03.2015, 23:37
2 ответа

Итак, вы хотите выполнить команду в каждом каталоге дерева каталогов - текущий каталог, его подкаталоги, их подкаталоги и т.д. Первое, что нужно сделать, это перечислить соответствующие каталоги. С помощью команды find сообщите ей список только каталогов:

find . -type d

Команда, которую требуется выполнить в каждом каталоге:

gmic ./*jpg -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg

Это команда оболочки, содержащая подстановочное расширение и подстановку команд. Для его выполнения необходимо запустить оболочку. Поскольку этой оболочке будет сказано, что делать, найти , это не будет оболочка, которую вы запускаете найти в: вы должны сказать найти запустить оболочку. Передайте каталог, в котором вы хотите выступать в качестве аргумента, в оболочку.

find . -type d -exec sh -c '…' {} \;

Перед вызовом gmic необходимо выполнить несколько действий в этом сценарии: перейти в соответствующий каталог и проверить, что он содержит файлы .jpg .

find . -type d -exec sh -c '
  cd "$0" || exit
  set -- *.jpg
  if [ -e "$1" ]; then
    gmic "$@" -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg
  fi
' {} \;

Также можно указать найти для вывода списка файлов .jpg . Однако это затрудняет выполнение команды только по одной на каталог.

Если оболочка является bash, в отличие от простой sh , можно использовать ее * * подстановочный символ для рекурсии в каталоги. Это проще, чем использовать найти . В bash ≤4.2 следует помнить, что * * также проходит символическую ссылку на каталоги. Вы также можете немного упростить проверку существования файла.

shopt -s globstar nullglob
for dir in ./**/*/; do
  files=("$dir/"*.jpg)
  if [[ ${#files[@]} -ne 0 ]]; then
    gmic "${files[@]}" -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o "$dir/-0000.$(date)".jpg
  fi
done

В zsh можно использовать модификатор истории в квалификаторе glob для перечисления каталогов, содержащих файлы .jpg , а затем фильтровать результирующий массив для сохранения одной копии каждого каталога.

dirs=(./**/*.jpg(:h))
for dir in ${(u)dirs}; do
  gmic $dir/*.jpg -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o "$dir/-0000.$(date).jpg"
done

(Кроме: -0000.Sat Mar 14 15:51:28 CET 2015 .jpg - это действительно странное имя для файла. Файлы, имя которых начинается с - , как правило, вызывают проблемы, поскольку они похожи на параметры команд. Датами удобнее манипулировать в формате, где сортировка лексикографически идентична сортировке хронологически, например 20150314-145128 .)

-121--133601-

OpenElec компилирует Python с отключенной поддержкой readline. Readline - это библиотека, используемая интерактивным интерпретатором Python, поэтому без нее клавиши курсора работать не будут.

Библиотека readline присутствует в системе, поэтому можно скомпилировать rlwrap (небольшую обертку, обеспечивающую выпуск командной строки readline для любой команды) и запустить rlwrap python . Вам потребуется установить средства компиляции на наш компьютер Ubuntu, затем загрузить источник rlwrap и скомпилировать его. Альтернативно, может существовать подходящий двоичный код ARM rlwrap .

Можно также установить rlwrap на ПК и запустить rlwrap ssh pi python .

-121--139575-

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

Если ввести команду exit , она сначала будет сохранена в журнале, а затем оболочка будет закрыта. Ввод ctrl - D создает EOF; поскольку это не команда, а входное состояние, его невозможно сохранить в журнале оболочки.

Обратите внимание, что вы можете дать команду bash игнорировать EOF; Это можно сделать 2 способами:

  • set -o ignoreeof
  • IGNOREOF = n

Первый способ эквивалентен IGNOREEOF = 10 , что означает, что перед выходом оболочки необходимо нажать ctrl - D 10 раз подряд. Это необходимо для предотвращения случайного завершения оболочки, например, при неправильном вводе ctrl - C или т.п.

Обратите внимание на то, что ctrl - D создает только EOF при вводе в качестве первой вещи в строке (т.е. после ввода), bash игнорирует его, если что-либо уже было набрано в строке.

ctrl - D также создает EOF вне оболочки. Например:

$ wc
foo bar
<ctrl-D>
      1       2       8

wc насчитал 1 строку, 2 слова, 8 символов (включая новую строку).

Вот пример с использованием ctrl - D после того, как в строке был дан некоторый ввод:

$ wc
foo bar<ctrl-D><ctrl-D>       0       2       7

Теперь wc отсчитал нулевые строки (не было дано enter ), 2 слова и 7 символы. Две последовательности ctrl - D были необходимы, поскольку данные уже были даны; обратите внимание, что bash обрабатывает это специально (игнорируя EOF , если что-то уже было введено в строку), тогда как, например, тире нет. Вероятно, это связано со средством редактирования строк в bash .

1
27.01.2020, 23:37

Если предложение @StéphaneChazelas об увеличении ServerAliveInterval не работает (может быть, попробуйте значение 300), то, возможно, вы захотите рассмотреть что-то вроде экрана GNU screen или tmux, чтобы можно было возобновить оборванные соединения.

У меня это в верхней части моего ~/.bashrc на всех моих удаленных системах:

screen -r >/dev/null 2>&1

Это ничего не сделает, если у вас нет отключенного сеанса экрана (например, если это ваше второе соединение, или если вы только что перезагрузились), но если у вас есть сеанс экрана (который не подключен в другом месте), то он автоматически перезагрузит вас. Бам, вся Ваша предыдущая история (и активные команды и т.д.) восстанавливается. (Это предполагает, что вы запускаете screen при первом входе в систему.)

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

while sleep 1; do ssh remotehost; done

Таким образом, когда вы отключаетесь, вы автоматически восстанавливаете соединение (это даже прозрачно, предполагая, что у вас есть ключ ssh и вы используете ssh-agent или ключ без пароля).

1
27.01.2020, 23:37

Теги

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