/dev/ptmx
является стандартным, /dev/pts/ptmx
добавляется для программных контейнеров (Docker и т. д. )и других случаях, когда вам нужно несколько экземпляров файловой системы devpts
.
Вы должны понимать, что «волшебство» узла устройства заключается не в его имени, а в старшем и второстепенном номерах устройств , для воплощения которых он создан.
Например, если у вас есть соответствующие привилегии, вы можете использовать mknod
для создания узла символьного устройства со старшим 1 и младшим 3 с любым именем в любой файловой системе в стиле Unix -и -, если только файловая система имеет параметр монтирования nodev
-, она будет вести себя точно так же, как /dev/null
, потому что во всех смыслах и целях она будет другой реализацией /dev/null
.
Точно так же и /dev/pts/ptmx
, и /dev/ptmx
являются символьными устройствами со старшим номером 5 и младшим номером 2. Таким образом, они обеспечивают доступ к точно таким же функциям в ядре.
$ ls -l /dev/ptmx /dev/pts/ptmx
crw-rw-rw- 1 root tty 5, 2 Jun 12 20:14 /dev/ptmx
c--------- 1 root root 5, 2 Jun 12 12:26 /dev/pts/ptmx
Тип символа узла устройства (или блока )и старший и младший номера устройства вместе определяют, с каким драйвером устройства ядра взаимодействует этот узел устройства. Ядро не заботится об именах -, оно предоставляет имена по умолчанию для udev
,но вы можете полностью изменить схему именования устройств, если хотите. При необходимости вы можете создавать узлы устройств за пределами /dev
.
В Debian 9 для разрешения /dev/pts/ptmx
по умолчанию установлено значение 000, поэтому предполагается, что оно не будет использоваться. Аналогично в RHEL 7.5.
Комментарий в исходном коде ядра 4.17 говорит:
/*
* ptmx is a new node in /dev/pts and will be unused in legacy (single-
* instance) mode. To prevent surprises in user space, set permissions of
* ptmx to 0. Use 'chmod' or remount with '-o ptmxmode' to set meaningful
* permissions.
*/
«режим одиночного экземпляра -» относится к использованию в качестве системы, соответствующей стандартам UNIX98 и Single Unix Specification v1. Поэтому очень важна обратная совместимость.
Возможность использования нескольких экземпляров -для devpts
была разработана для поддержки контейнеров. В этом можно убедиться, прочитав старые версии
от 2009 года или около того :
.
To support containers, we now allow multiple instances of devpts filesystem, such that indices of ptys allocated in one instance are independent of indices allocated in other instances of devpts.
To preserve backward compatibility, this support for multiple instances is enabled only if:
- CONFIG_DEVPTS_MULTIPLE_INSTANCES=y, and
- '-o newinstance' mount option is specified while mounting devpts
IOW, devpts now supports both single-instance and multi-instance semantics.
Когда используются контейнеры, они обычно инициализируют совершенно новое пространство имен для псевдо -TTY и могут монтировать другой экземпляр файловой системы devpts
внутри контейнера (, это можно даже опустить, если псевдо -] Поддержка TTY внутри контейнера не требуется ). Наличие записи ptmx
в файловой системе devpts
может быть полезно для минимизации работы, необходимой для инициализации среды контейнера in -.
Я бы не стал использовать для этого саму оболочку.
Другая реализация awk
$ awk 'BEGIN{OFS=FS="|"} {split($NF,a,","); for(i in a) {$NF = a[i]; print}}' data
ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300
или с Миллером
$ mlr --nidx --fs '|' nest --explode --values --across-records --nested-fs ',' -f 4 data
ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300
или более компактно
mlr --nidx --fs '|' nest --evar ',' -f 4 data
Если вам действительно нужно использовать оболочку, то с соответствующим недавним bash:
#!/bin/bash
while IFS='|' read -a fields; do
IFS=',' read -a vals <<<"${fields[ -1]}"
unset 'fields[ -1]'
for v in "${vals[@]}"; do
printf '%s|' "${fields[@]}"
printf '%s\n' "$v"
done
done < data
Например:
#!/usr/bin/env sh
s="ABC|RAM|BANGALORE|100,200,300"
header="$(echo "$s" | rev | cut -d'|' -f2- | rev)"
list="$(echo "$s" | rev | cut -d'|' -f1 | rev)"
IFS=','
for i in $list
do
printf "%s|" "$header"
printf "%s\n" "$i"
done
Выход:
ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300
С awk:
awk -F "," ' #Sets field separator to,
NF<2{print;next}
{
print $1 #Print first line up to,
sub(/[^|]*$/,"",$1) #Remove all that is after | in $1
for(i=2;i<=NF;i++){ #Print each remaining field after the first field
printf "%s%s\n",$1,$i
}
}
' file
Пример файла:
ABC|RAM|BANGALORE|100,200,300
ABC|BA00|
ABC|RAM|BANGALO00|200,300
Выход:
ABC|RAM|BANGALORE|100
ABC|RAM|BANGALORE|200
ABC|RAM|BANGALORE|300
ABC|BA00|
ABC|RAM|BANGALO00|200
ABC|RAM|BANGALO00|300