Вы считаете, что это неправильно, я думаю. Awk-х system
просто принимает любую старую строку, чтобы дать ему одну, например .:
system("echo " var); # see side note below
(помните, что в AWK, строки соединяются по смежности). Кроме того, system
выполняет только команду; чтобы захватить его выход, вам нужно использовать getline
, аналогично вашему вопросу №1.
Если вы хотите, чтобы прочитать все выходные ls
вам нужно цикла по результату от getline
:
awk 'BEGIN { while ("ls" | getline var) print "I got: " var; }'
Поскольку это определяет только BEGIN
действие, awk
запустится, запустите ls
, собирать каждый выход и распечатайте его, а затем выйдите.
Side Примечание: будьте очень осторожно с переменными, переданным в оболочку (это включает в себя как звонки на system
и элементы на левой стороне | getline
, а также некоторые другие случаи в современных сортах awk
-anything, выполняющие команда). Backquotes, $(command)
, и точки с запятой могут позволить пользователям вызывать произвольные команды. Например, в приведенном выше примере system("echo " var)
, если var
содержит ; rm -rf $HOME
, команда становится echo ; rm -rf $HOME
, что почти наверняка не то, что вы хотите.
Вы можете проверить «плохие» символы или объект, или указать их. Современные 8-битные чистые оболочки должны требовать только цитирования цитат (для синтаксической действительности), $
, <
, >
, |
и `
. Если вы используете одиночные кавычки для цитирования аргументов (чтобы они отображались как одно слово), вам нужно только избежать одиночных кавычек.См. this unix.stackexchange.com answer для получения более подробной информации.
одна сторона примечания: я, как правило, добавить «лишнюю» точку с запятой для моих AWK скриптов, делая их более похожие C синтаксический. Старая привычка лет назад.
torek: Благодарим за отзыв. Для этого приложения вы не можете назначить переменную output из system()? Как в этом примере: 'awk 'BEGIN {var =" ls -l "; Система (вар); print var} '' – Tedee12345
Функция' system': (1) запускает что-то до завершения; то (2) возвращает свое значение выхода. Значение 'ls' имеет значение 0 при успешном завершении. Итак, вы можете сделать 'x = system (foo); print "ran" foo "и получил" x; ", например. Если 'foo' - это строка' 'ls'', это будет запускать' ls', а выход будет выводиться на stdout awk и установить 'x' в 0, потому что' ls' преуспеет. – torek
Благодарим за отзыв. – Tedee12345