Вы пользователь 742342nd задаете этот FAQ bash. Ответ также описывает общий случай переменных, заданных в подоболочках, созданных трубами:
E4) Если я передаю вывод команды в
read variable
, то почему вывод не появляется в$variable
при завершении команды чтения?Это связано с тем, parent-child между процессами Unix. Он затрагивает все команды, выполняемые в конвейерах, а не просто вызовы
read
. Например, соединение вывода команды в циклеwhile
, которое повторно вызываетread
, приведет к такому же поведению.Каждый элемент конвейера, даже встроенная или оболочечная функция, запускается в отдельном process, дочерний элемент оболочки, запускающей конвейер. Подпроцесс не может повлиять на среду своего родителя. Когда команда
read
устанавливает переменную на вход, эта переменная устанавливается только в подоболочке, а не в родительской оболочке. Когда подоболочка выходит, значение переменной теряется.Многие конвейеры, которые заканчиваются на
read variable
, могут быть преобразованы в подстановки команд, которые будут захватывать вывод указанной команды. Затем результат может быть назначен переменной:grep ^gnu /usr/lib/news/active | wc -l | read ngroup
можно преобразовать в
ngroup=$(grep ^gnu /usr/lib/news/active | wc -l)
Это, к сожалению, не работает, чтобы разделить текст между несколькими переменными, так как read, когда задано несколько переменных аргументов. Если вам нужно это сделать, вы можете либо использовать подстановку выше, чтобы прочитать выход в переменную, и отрубить переменную с помощью операторов расширения удаления шаблонов bash или использовать какой-то вариант следующего подхода.
Say / usr / local / bin / ipaddr - это следующий сценарий оболочки:
#! /bin/sh host `hostname` | awk '/address/ {print $NF}'
Вместо использования
/usr/local/bin/ipaddr | read A B C D
, чтобы разбить IP-адрес локального компьютера на отдельные октеты, используйте
OIFS="$IFS" IFS=. set -- $(/usr/local/bin/ipaddr) IFS="$OIFS" A="$1" B="$2" C="$3" D="$4"
Остерегайтесь, однако, что это изменит позиционные параметры оболочки. Если вам это нужно, вы должны сохранить их, прежде чем делать это.
Это общий подход - в большинстве случаев вам не нужно устанавливать $ IFS на другое значение.
Некоторые другие пользовательские альтернативы включают в себя:
read A B C D << HERE $(IFS=.; echo $(/usr/local/bin/ipaddr)) HERE
и, где доступна подстановка процесса,
read A B C D < <(IFS=.; echo $(/usr/local/bin/ipaddr))
Это наследование: http://www.teach-ict.com/as_as_computing/ocr/H447/F453/3_3_6/uml/miniweb/pg6.htm
В Java extends явно определяется отношение IS-A.
Это будет диаграмма, это отношение наследования (IS-A):
[/g0]
Значение этого отношения: «класс cserver - это класс Thread, но класс Thread не является классом cserver».
[/g1]
Я рекомендую вам использовать CServer как имя класса, проверьте эти соглашения об именах Java: http://en.wikipedia.org/ вики / Naming_convention_ (программирование) #Java