
Я пытаюсь закодировать эту команду для запуска на экране вместе с двумя другими, которые будут использовать cat
для чтения файла, а затем передавать его awk
для фильтрации. Вот команда;
screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt | awk '{print $1}' > /var/www/html/filter/first.txt
Если я проверю отсоединенный экран, то увижу, что он фильтрует список, когда он завершается, файл first.txt
создается, но пустой. Я видел что-то об использовании -L
в экране для выходного журнала, но я хочу, чтобы вывод отправлялся в ту же папку, в которой находится неотфильтрованный список и называется first.txt
, я не могу понять, почему он успешно запускается, но выходной файл каждый раз пустой. Если я запускаю его без screen -d -m
созданного файла, он не пустой. Я думаю, что я что-то упускаю с командой screen. Я только начал использовать screen. Я не уверен, когда еще опубликовать.
решение1
Причина, по которой это не сработает, заключается в том, что оболочка разбивает команду на две части следующим образом:
screen -d -m /bin/cat /var/www/html/filter/unfiltered.txt
awk '{print $1}' >/var/www/html/filter/first.txt
Работает screen
на cat
отдельном pty. Тогда нет выхода настандартный выводдля передачи по трубе awk
.
Если вы хотите, чтобы канал запускался под экраном, вам необходимо сгруппировать его с другим экземпляром оболочки:
screen -d -m bash -c 'cat /var/www/html/filter/unfiltered.txt | awk "{print $1}" >/var/www/html/filter/first.txt'
После этого должно стать ясно, что это бесполезное использование cat
и на самом деле команду можно упростить следующим образом:
screen -d -m bash -c 'awk "{print $1}" </var/www/html/filter/unfiltered.txt >/var/www/html/filter/first.txt'
Обратите внимание, я изменил внутренние кавычки с одинарных на двойные. Это потому, что я использовал одинарные кавычки для защиты всей команды (и особенно $1
от ранней оценки).