как предотвратить расширение псевдонима 'оценкой' к произвольному псевдониму и сохранить защиту бесконечного цикла на функции?

@sch имеет, приводят меня к этому решению:

sed -bne '/\r$/ {p;q}' < /path/to/file | grep -q .

Это выходит с TRUE, если файл имеет какие-либо строки, заканчивающиеся CR. Сцеплять это в находку:

find /path/to/ -type f -exec sh -c 'sed -bne "/\r$/ {p;q}" < "$1" | grep -q .' sh {} \; -print

И я думаю, что знаю почему grep -l ^M hello.* не работает в этой оболочке: это кажется этим в Bash Мерзавца ^M символы удалены из всех параметров командной строки, таким образом, grep никогда на самом деле получает символ и поэтому все соответствие файлов. Это поведение не находится только на командной строке, но и в сценариях оболочки также.

Таким образом, ключ должен выразить ^M символ с другими символами, такой как \r, вместо буквально.

2
23.05.2017, 15:40
3 ответа

Используя eval является неправильным во-первых. Оболочка уже оценила то, чему Вы передаете FUNCexecEcho, оценка во второй раз является неправильной и потенциально опасной. В Вашем коде Вы также отбрасываете статус выхода команды.

FUNCexecEcho() { 
  echo "EXEC: $@"
  "$@"
}

(без проблем с псевдонимами там, если Вы не определяете псевдоним для "$@"). Сравните поведение в:

FUNCexecEcho echo 'this;rm -rf "$HOME"'

с этими двумя версиями. С моим это дает:

$ FUNCexecEcho echo 'this;rm -rf "$HOME"'
EXEC: echo this;rm -rf "$HOME"
this;rm -rf "$HOME"

Я предлагаю, чтобы Вы не выполняли его с Вашим, если у Вас нет резервных копий ;-)

1
27.01.2020, 21:54

Можно также использовать команду, command. Как так:

$ alias echo="command echo 'hi: '"
$ echo "blah"
hi:  blah

Но я могу обойти псевдоним echo как так:

$ command echo "blah"
blah

Заметьте, что я на самом деле использовал command в моем alias определение также. Это избегает псевдонима от цикличного выполнения назад на себе.

2
27.01.2020, 21:54

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

Например: Я использую \ls когда я не хочу вызывать искаженную версию ls который является ls -thor.

В случае оценки Вам будет нужна двойная обратная косая черта, например. eval \\ls.

3
27.01.2020, 21:54

Теги

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