Проблемный скрипт был создан в Windows, а это означало, что он содержал символы новой строки DOS. Это привело к сбою выполнения сценария на виртуальной машине Unix.
Тот факт, что виртуальная машина работает в Windows, не является проблемой.
alias 'gsi=<<eof grep --color'
Псевдоним будет работать так же, как замена текста в препроцессоре, где замена снова интерпретируется как шелл-код.
Ваш не работал, как у вас "$1"
. С заменой gsi file.txt
на cat <<eof | grep --color "$1" file.txt
оболочка продолжает интерпретировать эту командную строку, и $1
в этот момент является первым позиционным параметром оболочки, который, вероятно, пуст, если только вы не сделали set something
заранее. Итак, вам нужно удалить "$1"
здесь. Вы также можете удалить UUOC.
gsi() { cat <<eof | grep --color "$1" ; }
неверно с точки зрения синтаксиса, так как после строки cat <<eof
отсутствует строка eof
.
Вы упомянули, что вставляете в терминал. Полностью откажитесь от -документа и используйте подходящую утилиту буфера обмена, напримерxclip
(или pbpaste
в Mac OS X ). С xclip
это будет сделано как
xclip -o -sel clip | grep --color 'sometext'
См. также 'xclip' и 'xsel' о разнице между этими двумя утилитами.
Ваша функция не будет использовать здесь -документ:
gsi () {
grep --color "$@"
}
Это позволит вам передать шаблон, а также любые другие параметры в grep
по общей линии, а grep
будет считываться со стандартного ввода.
Конец ввода сигнализируется нажатием Ctrl+D .
Вышеприведенное, возможно, смешало бы вставленное содержимое и результат grep
. Чтобы сначала накопить вставленное содержимое и , затем запустить grep
, вы можете использовать что-то вроде
gsi () {
trap 'rm -f "$buffer"' RETURN
local buffer="$(mktemp)"
cat >"$buffer" && grep --color "$@" "$buffer"
}
Здесь вставленный вывод помещается во временный файл перед запуском grep
. Временный файл удаляется при выходе из функции. Это примерно то, что bash
будет делать за кулисами, когда вы вставите в документ здесь -.