Один из распространенных способов сделать это — проверить, существует ли нужная вам программа и доступна ли она на вашем PATH
. Например:
get_username(){
uid="$1"
# First try using getent
if command -v getent > /dev/null 2>&1; then
getent passwd "$uid" | cut -d: -f1
# Next try using the UID as an operand to id.
elif command -v id > /dev/null 2>&1 && \
id -nu "$uid" > /dev/null 2>&1; then
id -nu "$uid"
# Next try perl - perl's getpwuid just calls the system's C library getpwuid
elif command -v perl >/dev/null 2>&1; then
perl -e '@u=getpwuid($ARGV[0]);
if ($u[0]) {print $u[0]} else {exit 2}' "$uid"
# As a last resort, parse `/etc/passwd`.
else
awk -v uid="$uid" -F: '
BEGIN {ec=2};
$3 == uid {print $1; ec=0; exit 0};
END {exit ec}' /etc/passwd
fi
}
Поскольку POSIX id
не поддерживает аргументы UID, предложение elif
для id
должно проверять не только наличие id
в PATH, но также и его выполнение без ошибок. Это означает, что он может запустить id
дважды, что, к счастью, не окажет заметного влияния на производительность. Также возможно, что и id
, и awk
будут запущены с одинаковым незначительным снижением производительности.
Кстати, при использовании этого метода нет необходимости сохранять выходные данные. Будет запущен только один из них, поэтому только один из них будет печатать выходные данные для возврата функции.
Это может быть простым объяснением:
Если терминальный процесс записывает в терминал (stdin
, stdout
и stderr
, все они указывают на одно и то же устройство/элемент ), тогда этот вывод не становится его следующим вводом. Очевидно.
эхо фу
не имеет такого же эффекта, как ввод fooвведите .
Так почему же другой процесс, пишущий на терминал, становится вводом терминала другого процесса? Не имеет никакого смысла.
В отличие от файла, с (псевдо-)терминалом данные, записываемые в него и считываемые с него, не связаны, поскольку источником данных является нечто совершенно другое (клавиатура или программа ). См. man 7 pty
. Псевдотерминал имеет клиентскую сторону, которая используется терминальными приложениями, и главную сторону, на которой генерируются входные данные для клиентской стороны.
Мой эмулятор терминала — konsole (PID 40818 ), в настоящее время работает только одна оболочка/терминал:
start cmd:> ll /proc/40818/fd
insgesamt 0
lr-x------ 1 hl hauke 64 27. Nov 15:06 0 -> 'pipe:[1177680901]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 1 -> 'socket:[89302]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 10 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 11 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 12 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 13 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 18 -> /dev/ptmx
lrwx------ 1 hl hauke 64 27. Nov 15:06 19 -> /dev/pts/40
lrwx------ 1 hl hauke 64 27. Nov 15:06 2 -> 'socket:[89302]'
l-wx------ 1 hl hauke 64 27. Nov 15:06 21 -> 'pipe:[1177664260]'
lr-x------ 1 hl hauke 64 27. Nov 15:06 28 -> 'pipe:[1177664264]'
l-wx------ 1 hl hauke 64 27. Nov 15:06 29 -> 'pipe:[1177664264]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 3 -> 'socket:[1177673938]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 4 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 5 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 6 -> 'socket:[1177650969]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 7 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 8 -> 'socket:[1177677086]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 9 -> 'socket:[1177677087]'
ec:0 15:06:36 hl@monster:~
start cmd:> tty
/dev/pts/40
Как видите, оболочка использует /dev/pts/40
, но эмулятор терминала пишет в /dev/ptmx
. Только файловый дескриптор 18
эмулятора терминала может записывать на вход /dev/pts/40. Если другой процесс открывается /dev/ptmx
, он создает новый псевдотерминал, на который записывается.
Часть 1 -это ответ на ваш вопрос? Запись процесса на стандартный ввод
Часть 2 -вы можете писать в (и читать из )терминала, принадлежащего любому процессу, которым вы владеете. Но стандартные разрешения UNIX не позволят вам писать на (или читать с )любого устройства, связанного с другим логином пользователя.
ls -l /proc/$$/fd/0
lrwx------ 1 roaima roaima 64 Nov 27 13:19 /proc/7859/fd/0 -> /dev/pts/0
ls -lL /proc/$$/fd/0
crw--w---- 1 roaima tty 136, 0 Nov 27 13:24 /proc/7859/fd/0
Я могу писать на это устройство:
( tput smso; echo 'surprise!' ) >/dev/pts/0