Ответ Эдуардо правильный (и, как я писал это, появилось еще несколько хороших ответов), но я хотел бы объяснить, почему исходная команда терпит неудачу. Как обычно, set -x
очень полезно видеть, что на самом деле происходит:
$ set -x
$ who | grep $(echo $(tty) | sed 's/\/dev\///')
+ who
++ sed 's/\/dev\///'
+++ tty
++ echo not a tty
+ grep not a tty
grep: a: No such file or directory
grep: tty: No such file or directory
Это не полностью явное из вышеизложенного, но то, что происходит, заключается в том, что tty
выводит «не tty». Это связано с тем, что часть конвейера подается на выход who
, поэтому его stdin действительно не является tty. Это настоящая причина, по которой все остальные ответы работают: они выходят из tty
из-за конвейера, поэтому он может видеть ваш фактический терминал.
BTW, ваша предлагаемая команда в основном правильна (за исключением проблемы с конвейером) , но излишне сложный. Не используйте echo $(tty)
, это по сути то же самое, что только tty
.
Единственным условием существования элемента flex является дочерний поток гибкого контейнера.
Обратите внимание: это означает, что непрерывный пробег текста может быть завернут внутри анонимный элемент гибкости, который не соответствует ни одному элементу, а дочерний элемент гибкого контейнера может не быть гибким элементом, если любой из следующих
display: contents
. Сам элемент не генерирует никаких полей, но его дети и псевдоэлементы все равно генерируют ящики как обычно. Для создания и компоновки ящиков элемент должен обрабатываться так, как если бы он был заменен его дочерними элементами и псевдоэлементами в дереве документов. Его дети станут вместо этого элементами гибкости (если к ним не относится что-то из этого списка). display: none
Элемент и его потомки не генерируют никаких полей. box-suppress: discard
Элемент вообще не генерирует никаких полей. box-suppress: hide
. Элемент генерирует поля как обычно, но эти поля никак не участвуют в компоновке и не должны отображаться. display
, сгенерировавшее анонимного родителя, этот родитель стал элементом гибкости, а не дочерним. Это изменилось, и теперь ребенок становится элементом гибкости, и родитель не генерируется. Кроме того, да, значение display
не должно препятствовать элементу быть гибким элементом.
Имейте в виду, что элементы гибкости заблокированы , поэтому, например, inline-block
становится block
, inline-table
становится table
, inline-flex
становится flex
и т. д. .
Это означает, что независимо от указанной внешней отображаемой роли элемент flex всегда будет блочным.
В принципе, свойство display
, когда используется на гибком элементе, полезно только установить его модель макета внутреннего дисплея , например что вы хотите, чтобы элемент flex был контейнером flex для его содержимого.
Элемент flex устанавливает новый контекст форматирования для его содержимого. Тип этого формата форматирования определяется его значением
blockquote>display
, как обычно. Однако сами гибкие элементы представляют собой гибкие уровни , а не блочные блоки: они участвуют в контексте форматирования гибкости своего контейнера, а не в контексте форматирования блока.(Терминология немного отличается, спецификация дисплея говорит, что элемент гибкости является блочным уровнем в смысле его внешней роли отображения, спецификация Flexbox говорит, что он не является блочным уровнем в том смысле, что контекст форматирования, в котором он участвует, не является блок-блок)