Цитата X (7)
:
С точки зрения пользователя , каждый X-сервер имеет отображаемое имя в форме:
hostname: displaynumber.screennumber
Каждый X-сервер имеет один дисплей (который может включать несколько мониторов или даже не мониторы вообще). Для использования нескольких дисплеев (в смысле X) требуется несколько серверов X; таким образом вы тоже получаете несколько мест.
Что касается совместного использования, я думаю, что каждый X-сервер ожидает «владеть» устройствами, которые он использует в любой момент времени, поэтому вы не можете получать ввод с одной клавиатуры, идущий на несколько X-серверов одновременно, или вывод несколько X-серверов, объединенных на одном мониторе. X-серверы могут отключать оборудование, что позволяет запускать X-серверы на нескольких VT и переключаться между ними (так обрабатываются одновременные входы в систему , например в GNOME). Вы также можете вложить некоторые X-серверы ( Xephyr
, xpra
...), чтобы входные данные поступали на ваш основной текущий X-сервер и передавались на вложенный X-сервер в окне ; а вывод вложенного X-сервера отображается в окне главным X-сервером.
В Linux вы могли написать драйвер ввода мультиплексирования на уровне ввода для совместного использования устройств ввода, но это совсем другой уровень, чем X-сервер.
Использование конвейера позволяет запускать команды в разных подоболочках, поэтому вы получаете сообщение об ошибке, поскольку обе команды([
иgrep
)являются неполными (соответственно, не работают должным образом ).
Если вы просто хотите протестировать результирующий код программы, вам не нужно использовать [ … ]
или test
, они вам понадобятся только для более четкого сравнения, например [ 1 -gt 2 ]
или [ "$1" == "$2" ]
. Если вам нужны еще более сложные сравнения, такие как использование регулярных выражений, вы должны использовать команду [[ … ]]
, см. Тестовые конструкции . и Краткое введение в регулярные выражения в «Advanced Bash -Scripting Guide»
Вот еще один вариант скрипта, который будет делать то же самое:
#! /bin/bash
read -p 'Want Task 1 '
if [ "${REPLY^}" = Y ] ; then
echo 'Task One Done'
read -p 'Want Task 2 ?? '
if [ "${REPLY,}" = y ] ; then
echo 'Task 2 Done'
fi
fi
Переменная по умолчанию для read
— $REPLY
. При использовании ${REPLY^}
вы получите содержимое в верхнем регистре, а при использовании ${REPLY,}
— в нижнем. Поскольку переменная может быть пустой, вам нужно заключить ее в кавычки "
.
Если вы действительно хотите вызвать внешнюю программу, такую как grep
, вы можете сделать это следующим образом:
read -p 'Want Task 1 '
if echo $REPLY | grep -icq ^y ; then
echo 'Task 1 Done'
fi
Что на самом деле происходит выше, так это то, что мы запускаем команду, и если значение выхода не равно 0, это правда. Этот пример покажет это:
if /bin/true ; then
echo We have always the yes hat on
fi
А [
— это просто программа с именем /usr/bin/test
. Ищите его в разделе man test
.