Как отметил @Mat, скрипт
вероятно имеет Windows newlines (возврат каретки/CR с последующей подачей строки aka. LF). Сравните:
$ echo : No such file or directoryonfig.conf
: No such file or directoryonfig.conf
$ printf '/[.................]/conf/config.conf\r: No such file or directory\n'
: No such file or directoryonfig.conf
Используйте dos2unix thescript
для исправления.
GREP
(IE, / Bin / grep
) будет читать со стандартного ввода
Если это вызывается без аргументов имени файла.
Так что просто написать сценарий, который работает GREP
с входом
От стандартного ввода - просто вызывают GREP
без аргументов имени файла.
Но GREP
должен быть дан (по крайней мере) один шаблон аргумент (или эквивалент).
Чрезвычайно негибкий способ сделать это,
что вряд ли будет очень полезным в реальной жизни,
это сложная строка поиска (шаблон) в ваш сценарий GREP; E.g.,
#!/bin/sh
grep --color=always cat
, которые могут быть использованы в контексте
ps | mygrep
и, вероятно, не так много. А Слегка Более гибкий скрипт Можно использовать переменную среды в качестве строки поиска:
#!/bin/sh
grep --color=always $USER
, которые могут быть использованы в контексте
ps -ef | mygrep
и, вероятно, не так много. Единственный разумный, реалистичный, надежный раствор это позволить пользователю сценария Чтобы показать строку поиска в качестве аргумента командной строки:
#!/bin/sh
grep --color=always $1
, которые могут быть использованы в контексте
dmesg | mygrep TCP
и могут быть действительно полезны.
Ну, может быть, я должен сказать несколько полезным. Это довольно быстро ломается, Как вам может понадобиться несколько аргументов, чтобы указать параметры поиска:
mygrep -i tcp Case-insensitive search; find tcp, TCP, Tcp, etc. mygrep -v bash Find everything except bash. mygrep -e cat -e dog Find every line that contains cat or dog. mygrep -f wordlist Search strings are in a file.
, поэтому второй черновик нашего сценария может быть:
#!/bin/sh
grep --color=always $1 $2 $3 $4 $5 $6 $7 $8 $9
, который может обрабатывать любой из приведенных выше примеров. Как дополнительный бонус, Это не нужно использоваться для чтения стандартного ввода; Мы можем сказать
mygrep -i path .bashrc
, и он будет запущен
grep --color=always -i path .bashrc
, но мы еще не закончены! Рассмотрим
mygrep "cat food" "shopping list.txt"
, который будет запущен
grep --color=always cat food shopping list.txt
, который будет (попробовать) поиск CAT
в трех файлах:
Еда
, Shopping
, и List.txt
. Хорошо, мы можем справиться с этим, говоря
#!/bin/sh
grep --color=always "$1" "$2"
, но
#!/bin/sh
grep --color=always "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
не является хорошим ответом; Он включится
mygrep "cat food" "shopping list.txt"
в
grep --color=always "cat food" "shopping list.txt" "" "" "" "" "" "" ""
, который будет делать то, что вы хотите, но также выпустит семь сообщений об ошибках.
Итак, что делать, что делать? О, подожди; У меня есть кувалда в моем шкафу:
#!/bin/sh
if [ "$1" = "" ]
then
printf "%s\n" "error: mygrep must be run with at least one argument."
elif [ "$2" = "" ]
then
grep --color=always "$1"
elif [ "$3" = "" ]
then
grep --color=always "$1" "$2"
elif [ "$4" = "" ]
then
grep --color=always "$1" "$2" "$3"
elif [ "$5" = "" ]
then
grep --color=always "$1" "$2" "$3" "$4"
elif [ "$6" = "" ]
then
grep --color=always "$1" "$2" "$3" "$4" "$5"
elif [ "$7" = "" ]
then
grep --color=always "$1" "$2" "$3" "$4" "$5" "$6"
elif [ "$8" = "" ]
then
grep --color=always "$1" "$2" "$3" "$4" "$5" "$6" "$7"
elif [ "$9" = "" ]
then
grep --color=always "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8"
else
grep --color=always "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
fi
верно.
Даже это не удается для
MyGrep -e-Cat -e-Dog -e File File1 File2 File3 File4
Потому что он имеет более девять аргументов! И, хотя эта ситуация может показаться маловероятной, та же проблема возникает с
Bygrep Bird *
Если в текущем каталоге существует более восьми (не скрытых) файлов.
Если вы посмотрите в bash (1)
Под специальные параметры ,
Вы увидите, что $ @
расширяется к списку позиционных параметров,
начиная с одного. Когда расширение происходит в двойных кавычках,
Каждый параметр расширяется до отдельного слова.
То есть «$ @»
эквивалентно «$ 1»
«$ 2»
...
(как реализовано в длинном скрипте, выше,
Но не ограничивается первым девятым).
Итак, способ написать скрипт, чтобы обернуть
(то есть, действуйте как фронт) в некоторой команде, действуя как псевдоним, это
#!/bin/sh
grep --color=always "$@"
Псевдоним будет работать. У меня GREP
Псевдоним
псевдоним на GREP --CLOR = AUTO
:
% which grep
grep: aliased to grep --color=auto
И трубопроводы к GREP имеют поведение, которое вы желаете: