Как запустить исполняемую программу с фильтром

Если вы используете Puppet, то facter встроил поддержку для sshfp. Кроме того, если вы используете PuppetDB, вы можете легко извлечь эту информацию для всех ваших хостов.

facter | grep -i sshfp
  sshfp_dsa => SSHFP 2 1 e1a3e639d6dbd48d3964ebfb772d2d11f1065682
  SSHFP 2 2 4f620ce2bc97d91ae5eff42fba621d65b677ab725f275f56b2abd1303c142b73
  sshfp_rsa => SSHFP 1 1 a78351af371faf3f19533c3a4a9e967543d7d2f5
  SSHFP 1 2 795943a6ee8b53c818cfef5781209e25a6eb4bc386813db60d3ff2c1569692fc

Source

1
23.06.2014, 12:13
3 ответа

Для этого можно использовать xargs :

ls | grep myfile | xargs sh

xargs читает строки на своих входных данных и дает их в качестве аргументов программе, которую он аргументирует: здесь он прочитает вывод grep, а затем выполнит sh long_myfile_name. (Измените sh на bash, если ваш скрипт зависит от особенностей Bash-специфики, или другой оболочки)

Вы также можете запустить sh *myfile* с практически таким же эффектом в этом простом случае - если ваш grep более сложный, вы, возможно, не сможете этого сделать, но sh "$(ls | grep . ...)" сработает.


Тем не менее, есть некоторые причины, по которым Вы, возможно, не захотите этого делать: в частности, если возможно, что в какой-то момент будет два файла, которые будут совпадать с Вашим grep. В этот момент произойдет одна из трех вещей: ваш скрипт получит дополнительный аргумент, будут запущены два разных скрипта, или вместо него будет запущен другой скрипт. Вы можете, скажем, подключиться к голове -n 1, чтобы избежать первых двух, но затем будет выполнен произвольный, что не очень помогает. В случае $() он просто провалится, что, вероятно, является лучшим из плохих результатов. Если в именах файлов есть пробелы, вам придется позаботиться о них еще больше.

Завершение работы с вкладками в оболочке может быть лучшим вариантом: скорее всего, вы можете написать *myfile* и нажать TAB, чтобы получить либо правильное расширение, либо указание на то, что существует более одной возможности, или даже просто начать писать имя и завершение работы с вкладками до конца. Если вы выполняете это в скрипте, просто поместите полное имя там - вы должны написать его только один раз. Ответ выше строки будет работать, но я не очень рекомендую это.

.
1
27.01.2020, 23:28

можно использовать xargs, например

ls | grep myfile | xargs bash

или фильтр, используя find

find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;
0
27.01.2020, 23:28

Просто введите:

*myfile*

Вы также можете сделать:

"$(ls | grep pattern)"

если вы заполняете регулярное выражение, совпадающее с именем файла, а не только подстановочные знаки.

Все эти решения предполагают, что в текущей директории есть только один файл, который соответствует шаблону.

2
27.01.2020, 23:28

Теги

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