Какой Unix -подобная система действительно предоставляет специальный файл / dev / tcp?

Вы можете использовать следующий скрипт:

$ cat myll
#!/bin/bash
name="$1"
while [[ -L "$name" ]]; do
ls -l "$name"; 
name=`readlink "$name"`;
done

Пример вывода:

$ myll /usr/bin/gnome-text-editor
lrwxrwxrwx 1 root root 35 Mar 16  2015 /usr/bin/gnome-text-editor -> /etc/alternatives/gnome-text-editor
lrwxrwxrwx 1 root root 14 Mar 16  2015 /etc/alternatives/gnome-text-editor -> /usr/bin/gedit

Здесь [[ -L "$name" ]] проверяет, является ли файл ссылкой или нет и readlink "$name" читает ссылку и сохраняет ее в переменной name для следующего цикла. И, следовательно, while [[ -L "$name" ]] зацикливается, пока не будет достигнута исходная цель/файл.


Для второго обходного пути можно использовать:

#!/bin/bash
name="$1"
while [[ -L "$name" ]]; do
echo -n "$name > ";
name=`readlink "$name"`;
done
echo "$name"

Пример вывода:

$ myls /usr/bin/gnome-text-editor
/usr/bin/gnome-text-editor > /etc/alternatives/gnome-text-editor > /usr/bin/gedit
9
14.01.2019, 13:25
1 ответ

Я думаю, что документация Bash несколько вводит в заблуждение по этому вопросу. Глядя на код, даже возвращаясь к версии 2.04, где были введены сетевые перенаправления, /dev/tcpи /dev/udpработают следующим образом:

  • во время сборки скрипт configureпроверяет, поддерживаются ли различные сетевые функции; если да, то если сетевое перенаправление включено (, что имеет место по умолчанию ), встроен внутренний сетевой код;
  • во время выполнения, если внутренний сетевой код встроен, /dev/tcpи/dev/udp(в правильном формате )обрабатываются внутри; в противном случае выдается предупреждение («/dev/ (tcp|udp )/host/port не поддерживается без подключения к сети» )и Bash пытается открыть указанный путь в системе;
  • если сетевые перенаправления отключены, ничего особенного не делается.

Это сводится к:

  • , если включено сетевое перенаправление :
    • если сеть поддерживается на целевой платформе, /dev/tcpи /dev/udpвсегда будут обрабатываться внутри;
    • иначе,Bash предупредит и попытается открыть файл «вслепую»; если система как-то поддерживает /dev/(tcp|udp)/host/port, то он будет использован, иначе, по всей вероятности, перенаправление не удастся;
  • если сетевое перенаправление отключено, никакой специальной обработки не выполняется; как и выше, если система каким-то образом поддерживает /dev/(tcp|udp)/host/port, то это будет использоваться, иначе, по всей вероятности, перенаправление не удастся.

/dev/tcpсуществует в некоторых системах, но, насколько мне известно, ни одна из них не поддерживает ту же абстракцию, что и Bash. В Solaris /dev/tcpиспользуется с инструментом nddдля запроса и изменения конфигурации сети. В XTI(см. также открытую группу , если вы являетесь участником ), функцию t_openможно использовать с /dev/tcpдля открытия TCP-соединения, но она не не используйте настройку на основе пути -, существует отдельная структура данных для указания целевого хоста и порта (и других параметров ).

8
27.01.2020, 20:07

Теги

Похожие вопросы