У меня есть несколько серверов Ubuntu, и есть поведение, которое вызывает у меня любопытство.
На любом недавно установленном компьютере (Ubuntu Server 12.04.3 LTS), если я запускаю:
echo "testbla123" | grep -P -o [0-9]*
Это вернет 123
, как и ожидалось.
На более старой машине (Ubuntu Server 12.04.1 LTS), если я запускаю ту же команду, я ничего не получаю, вместо этого мне нужно выполнить:
echo "testbla123" | grep -P -o "[0-9]*"
После выполнения apt-get upgrade
, он будет работать без кавычек вокруг регулярного выражения.
Grep имеет одинаковые версии на обеих машинах. Я пытался сравнить зависимости до и после обновления в течение некоторого времени без особой удачи.
Мне было интересно, кто-нибудь знает, почему это происходит?
Скорее всего, у вас есть файл, который соответствует шаблону глобуса [0-9]*
на вашем втором компьютере, а не на первом. Если это так, оболочка расширит глобус до имени файла перед передачей его в качестве аргумента grep
.
Если в текущем каталоге нет файла, который соответствует, оболочка оставляет шаблон глобуса нетронутым и передает его как есть команде.
$ echo abc123 | grep -P -o [0-9]*
123
$ touch 234
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 234
$ touch 123
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 123 234
$ rm 234 123
$ touch 12
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 12
12
$
Всегда заключайте в кавычки параметры, содержащие подстановочные знаки оболочки, если вы не хотите, чтобы они расширялись оболочкой.