Я хочу запустить скрипт оболочки. У этого скрипта длинное имя. Поэтому я хочу использовать фильтр для файла.
бывший:ls | grep myfile | ./
Возможно ли выполнить файл с фильтром.
решение1
Просто введите:
*myfile*
Вы также можете сделать:
"$(ls | grep pattern)"
если вы используете полное регулярное выражение, а не просто подстановочные знаки в именах файлов.
Все эти решения предполагают, что в текущем каталоге есть только один файл, соответствующий шаблону.
решение2
Вы можете использоватьxargs
для такого рода вещей:
ls | grep myfile | xargs sh
xargs
считывает строки на входе и передает их в качестве аргументов программе, указанной в качестве аргумента: в данном случае он считывает вывод grep, а затем запускает sh long_myfile_name
. (Измените sh
на bash
, если ваш скрипт зависит от специфичных для Bash функций или какой-либо другой оболочки)
В этом простом случае вы также можете добиться sh *myfile*
того же эффекта — если у вас grep
более сложная ситуация, вы, возможно, не сможете этого сделать, но sh "$(ls | grep ...)"
это сработает.
Тем не менее, есть несколько причин, по которым вы можете не захотеть этого делать: в частности, если возможно, что в какой-то момент будет два файла, соответствующих вашему grep
. В этот момент произойдет одно из трех: ваш скрипт получит дополнительный аргумент, будут запущены два разных скрипта или вместо них будет запущен другой скрипт. Вы можете, скажем, выполнить pipe into, head -n 1
чтобы избежать первых двух, но тогда будет выполнен произвольный скрипт, что не поможет. В этом $()
случае он просто потерпит неудачу, что, вероятно, является лучшим из плохих результатов. Если в именах файлов есть пробелы, вам придется быть еще более осторожными.
Дополнение вашей оболочки может быть лучшим вариантом: вы, вероятно, можете написать *myfile*
и нажать TAB, чтобы получить либо правильное расширение, либо указание на то, что есть более одной возможности, или даже просто начать писать имя и завершить его нажатием Tab. Если вы запускаете это в скрипте, просто поместите туда полное имя — вам нужно написать его только один раз. Ответ над строкой подойдет, но я не очень рекомендую это делать.
решение3
вы можете использовать xargs
например
ls | grep myfile | xargs bash
или фильтровать с помощьюfind
find ./ -maxdepth 1 -name "myfile" -exec ./'{}' \;