Рейтинг:8

Почему этот псевдоним, использующий awk, не возвращает чистый ответ, как мои два других?

флаг cn

Я делаю несколько псевдонимов для своего терминала, чтобы выводить разные IP-адреса. Два из трех из них работают нормально, но мой шлюз по умолчанию не возвращает чистый ответ.

псевдоним inet="имя хоста -I | awk '{print $3}'" 

возвращает: 192.168.ххх.хх как предполагалось

псевдоним pubip="curl ifconfig.me"

возвращает: 354.ххх.хх.хх как предполагалось

Однако псевдоним, который я сделал, чтобы вернуть IP-адрес шлюза по умолчанию

псевдоним def="ip r | grep default | awk '{print $3}'"

возвращает: по умолчанию через 192.168.xxx.xxx dev eth0

Я использую ту же строку в терминале, и она вернет только шлюз по умолчанию, как и предполагалось.

Но когда он хранится как псевдоним, «awk» часть скрипта не работает.

Могу ли я не передавать псевдоним дважды? Что-то еще не так в моем коде?

Рейтинг:15
флаг cn
raj

В вашем определении псевдонима $3 на самом деле расширяется в момент определения псевдонима (хотя на первый взгляд так не выглядит). Если вы наберете псевдоним после определения вашего псевдонима (для просмотра определенных псевдонимов) вы увидите, что ваш псевдоним на самом деле имеет вид

псевдоним def='ip r | grep по умолчанию | awk '\''{печать}'\'''

и из-за Распечатать один в аук, вся строка, возвращенная grep печатается.

Используйте следующее, чтобы определить псевдоним:

псевдоним def="ip r | grep default | awk '{print \$3}'"

Тогда ваш псевдоним будет иметь вид:

псевдоним def='ip r | grep по умолчанию | awk '\''{print $3}'\'''

и он будет работать так, как вы хотите.

JakobyScream avatar
флаг cn
Вас очень ценят. Полное объяснение было отличным, я не был уверен, нужно ли мне экранировать какой-то символ или что-то еще, но да, теперь это работает по назначению. У тебя был хороший день
флаг us
вы также можете удалить grep: `alias def="ip r | awk '/default/ {print \$3}'"`
флаг cn
Вы также можете определить функцию вместо псевдонима и не беспокоиться ни о чем из этого.
Hopping Bunny avatar
флаг cn
Если целью является просто получение вывода (а не использование awk), вы можете использовать простую команду cut, например: `alias def="ip r|grep default|cut -d\" \" -f3"`. `-d` определяет "пробел" как разделитель, а `-f` указывает поле для печати. Обратная косая черта необходима, потому что мы заключаем команду в псевдоним, который уже имеет кавычки в начале и в конце. Если мы печатаем команду в терминале, они не нужны.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.