Leonid Evdokimov (darkk) wrote,
Leonid Evdokimov
darkk

bash-WTF: `foo` != $(foo)

А я тут замечательный WTF в sh встретил.

Есть строчка /var/log/daemon/api/*.log и нужно получить из неё регулярку для sed - т.е. поэскейпить звёздочку и точку.
Очевидное решение:
$ log="/var/log/daemon/api/*.log"
$ echo "$log" | sed 's/[\.\*]/\\&/g'
/var/log/daemon/api/\*\.log


Но есть пара неочевидных тонкостей:
$ log="/var/log/daemon/api/*.log"
$ echo "$log" | sed 's/[\.\*]/\\&/g'
/var/log/daemon/api/\*\.log
$ relog=`echo "$log" | sed 's/[\.\*]/\\&/g'`; echo $relog
/var/log/daemon/api/&&log
$ relog=$(echo "$log" | sed 's/[\.\*]/\\&/g'); echo $relog
/var/log/daemon/api/\*\.log
$ relog=`echo "$log" | sed 's/[\.\*]/\\\\&/g'`; echo $relog
/var/log/daemon/api/\*\.log


Отсюда важный вывод, о котором стоит помнить - escaping внутри `foo` и $(foo) работает по-разному.
Проверено на sh из FreeBSD-8.2, bash-4.1.10, bash-4.2.8, dash-0.5.5.1-7.2ubuntu1.

UPD: Впрочем, в man bash этот факт описан. :)
Tags: **it, bash, dash, freebsd, linux, sh
Subscribe

  • Vim + bash ≈ XML-редактор

    Иногда приходится читать простыни и небольшие простынки XML файлов из которых были нещадно вырезаны все пробелы. Для глаз это, конечно же, нулевое…

  • Пример использования telnet-сервера в firefox

    Это кросспост моей записи из хаброблога Огненный лис. Каждый раз, когда мне говорят «о! новый хромиум стал еще быстре, а новая опера — еще…

  • Thunderbird & text/plain; format=flowed

    Электронную почту изобрели давно и посылалась она простым преформатированным текстом, и были все текстовые терминалы шириной в 80 столбцов и было это…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments