Перенаправить вывод на less из внутреннего скрипта

Вы можете добавить разные профили в CUPS для одного принтера. Пример :У меня есть цветной лазерный принтер Samsung, и я использую профиль по умолчанию для цветной печати. и добавил второй профиль для оттенков серого. Всякий раз, когда я хочу печатать, я выбираю принтер по умолчанию или принтер в градациях серого.

Вы можете изменить это в веб-интерфейсе.

Изменить профиль по умолчанию (лоток 1 ):Перейдите к http ://localhost :631/admin -> «Управление принтерами» -> выберите принтер -> выберите «Установить параметры по умолчанию» из раскрывающегося списка -> выберите лоток 1 в качестве источника бумаги по умолчанию -> «Установить параметры по умолчанию»

Добавить еще один профиль (лоток 2 ):Перейдите к http ://localhost :631/admin -> «Добавить принтер» -> выберите принтер -> выберите другое имя и описание -> продолжить -> «Добавить принтер» -> выбрать лоток 2 в качестве источника бумаги по умолчанию -> «Установить параметры по умолчанию»

2
24.09.2020, 18:26
2 ответа

Ваш скрипт должен ожидать дочернего процесса less, иначе ваш скрипт завершится раньше него, и lessвнезапно окажется вне группы процессов переднего плана, не имея возможности читать команды с терминала или восстанавливать настройки терминала больше.

Кроме того, чтобы предотвратить lessвечное ожидание окончания своего ввода, ваш сценарий должен закрыть канал к нему.

Собираем все вместе:

exec > >(less) 2>&1
trap 'exec >&- 2>&-; wait' EXIT
# >&- 2>&- => close stdout and stderr => cause EOF on less' stdin

seq 1 50000
# the rest of your script

Но это не очень хорошо, не переносимо на большинство других оболочек, и, полагаясь на недокументированное (и ненадежное )поведение bash :, waitне будет нормально работать, если у вас более одного exec > >(...)в вашем скрипте, и он также будет ожидать других фоновых процессов, запущенных с помощью &.


Было бы лучше, если бы ваш скрипт вызывал сам себя, используя переменную среды, чтобы избежать бесконечной рекурсии:

if [ ! "$CALLED_MYSELF" ]; then
    set -o pipefail # supported in bash, but not in all the shells  
    CALLED_MYSELF=1 "$0" "$@" 2>&1 | less
    exit
fi

seq 1 50000
# the rest of your script
1
18.03.2021, 23:02

Попробуйте только это (без строки exec):

for (( i=1; i <= 500; i++ )); do echo "hello world $i"; done | less

(обновление)

Если вы хотите включить весь сценарий, вы можете обернуть сценарий с помощью{... }

#!/bin/bash
{
# output some text
for (( i=1; i <= 500; i++)) do echo "hello world $i"; done

# whatever output you want...

} | less
1
18.03.2021, 23:02

Теги

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