Канал к моему собственному сценарию

Как отметил @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 для исправления.

1
06.05.2015, 09:44
2 ответа

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

верно.

  1. Это смежно непрактично.
  2. Даже это не удается для

     MyGrep -e-Cat -e-Dog -e File File1 File2 File3 File4
     

    Потому что он имеет более девять аргументов! И, хотя эта ситуация может показаться маловероятной, та же проблема возникает с

     Bygrep Bird *
     

    Если в текущем каталоге существует более восьми (не скрытых) файлов.

Итак, что делать, что делать?

TL; DR

Если вы посмотрите в bash (1) Под специальные параметры , Вы увидите, что $ @ расширяется к списку позиционных параметров, начиная с одного. Когда расширение происходит в двойных кавычках, Каждый параметр расширяется до отдельного слова. То есть «$ @» эквивалентно «$ 1» «$ 2» ... (как реализовано в длинном скрипте, выше, Но не ограничивается первым девятым). Итак, способ написать скрипт, чтобы обернуть (то есть, действуйте как фронт) в некоторой команде, действуя как псевдоним, это

#!/bin/sh
grep --color=always "$@"
-1
27.01.2020, 23:50

Псевдоним будет работать. У меня GREP Псевдоним псевдоним на GREP --CLOR = AUTO :

% which grep
grep: aliased to grep --color=auto

И трубопроводы к GREP имеют поведение, которое вы желаете:

enter image description here

2
27.01.2020, 23:50

Теги

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