Современный способ сделать это - использовать команду ip
. Например, в моей системе с активным беспроводным подключением я получаю:
$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether 00:26:b9:dd:2c:28 brd ff:ff:ff:ff:ff:ff 3: wlp3s0b1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether c4:46:19:5f:dc:f5 brd ff:ff:ff:ff:ff:ff inet 192.168.1.4/24 brd 192.168.1.255 scope global wlp3s0b1 ← valid_lft forever preferred_lft forever inet6 fe80::c646:19ff:fe5f:dcf5/64 scope link valid_lft forever preferred_lft forever 16: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100 link/none inet 123.167.217.2/24 brd 123.167.217.255 scope global tun0 ← valid_lft forever preferred_lft forever
Активные интерфейсы имеют как запись inet
, так и широковещательный ( brd
) адрес. { {1}} Вы можете отобразить все такие интерфейсы с помощью:
$ ip addr show | awk '/inet.*brd/{print $NF}'
wlp3s0b1
tun0
Если вам нужен только один, вы можете получить первый (только) с помощью:
$ ip addr show | awk '/inet.*brd/{print $NF; exit}'
wlp3s0b1
Оператор exit
сообщает awk
, чтобы остановить поиск
после обнаружения первого совпадения.
Вы можете использовать eval
:
$ set -a
$ eval "$(command_that_generate_output)"
$ set +a
$ sh -c 'printf "%s\n" "$DATABASE_URL"'
someurl
$ export $( generate_env )
Это создаст экспортируемые переменные, используя данные, сгенерированные generate_env
.
Testing:
$ cat myenv
A=1
B=2
PIZZA=now
$ export $( cat myenv )
$ echo $PIZZA
now
$ echo $B
2