Экранированные пробелы не работают с «ls» при вводе в команду

Исторически сложилось так, что команда Unix mailвообще не использует сетевые службы. Он просто запускает /usr/sbin/sendmailс необходимыми параметрами и передает ему исходящую электронную почту. Именно отсюда sendmailполучил свое название. Для входящей почты он просто читал локальный системный почтовый ящик пользователя, расположенный по адресу /var/mail/<username>.

Из-за этого соглашения, даже если ваша Unix -подобная ОС использует другое программное обеспечение для передачи почты, такое как Postfix в случае macOS, это программное обеспечение должно предоставлять /usr/sbin/sendmailдвоичный файл, который понимает хорошо -известную набор опций для реализации этого старого простого интерфейса.

В результате этот метод вызова запускает только правую часть Postfix для однократной -отправки почты, даже если программное обеспечение Postfix не настроено иным образом и имеет заводские настройки по умолчанию :, если получатель является локальным пользователем., или сервер-получатель может быть определен из DNS-записей MX и/или A и достижим, почта будет отправлена ​​в пути, а процесс /usr/sbin/sendmailзавершится с кодом результата 0, указывая команде mail, что операция прошла успешно.

Но если сервер получателя не может быть немедленно достигнут, все ставки сняты :в этом случае компонент /usr/sbin/sendmailбудет хранить сообщение в очереди исходящей почты локальной системы (исторически /var/spool/mqueue, с Postfix вероятно/var/spool/postfix/deferred)... где он будет лежать, забытый, до конца времен, если остальная часть программного обеспечения для передачи почты не будет активирована, так как процесс, который должен периодически проверять очередь почты, не будет запущен.

0
16.09.2020, 22:53
2 ответа

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

$ touch 'some file.txt'
$ ls -l some\ file.txt 
-rw-r--r-- 1 ilkkachu ilkkachu 0 Sep 17 01:03 some file.txt
$ f='some file.txt'
$ ls -l "$f"
-rw-r--r-- 1 ilkkachu ilkkachu 0 Sep 17 01:03 some file.txt

На самом деле, как вы видели, это не работает. Кавычки и escape-последовательности являются специальными только перед раскрытием переменных, кавычки, которые появляются в результате раскрытия, не являются таковыми. Расширение переменной в командной строке оболочки — это не то же самое, что просто поместить содержимое переменной буквально в то же место в командной строке. (Это не макропроцессор, это язык программирования.)

$ s='foo\ bar'
$ printf ':%s\n' $s
:foo\
:bar
$ printf ':%s\n' "$s"
:foo\ bar

Без кавычек значение sразбивается на пробел (содержимым IFS), с кавычками — нет. Ни в том, ни в другом случае обратная косая черта не выходит за пределы пробела.

В подобном цикле for вы можете просто выполнить

for f in./**/*.vmdk; do
    ls -l "$f"
done

Хотя обратите внимание, что *[A-Za-z][!-flat][!-thin].vmdk, вероятно, не делает того, что вы имеете в виду, [A-Za-z]соответствует одному символу, который является буквой, а [!-flat]соответствует любому одному символу, который не является -, f, l, aили t. Это было бы, например. включить abc.vmdk, но не bac.vmdk.

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

for file in./**/*.vmdk; do
    case "$file" in
        *-flat.vmdk) continue;;
        *-thin.vmdk) continue;;
    esac
    echo "found: $file"
    ls -l "$file"
    new=${file%.vmdk}-thin.vmdk
    # vmkfstools -i "$file" -d thin "$new"
    # echo "New provisioned file: $new"
done

См.:

3
18.03.2021, 23:04

Пробелы в именах файлов будут вас ненавидеть, и вы будете их ненавидеть, особенно когда они передаются из имен файлов в globs в скриптовые команды оболочки. Пусть findи xargsсделают всю тяжелую работу за вас:

$  tree
.
+--- ABC Collector
|   +--- ABC Collector-flat.vmdk
|   +--- ABC Collector-thin.vmdk
|   +--- ABC Collector.vmdk
$  find. -type f -name '*.vmdk' -not -name '*-flat.vmdk' -not -name '*-thin.vmdk' -print0 | xargs -0 ls -lah
-rw-r--r--    1 myuser mygroup       0 Sep 16 14:29./ABC Collector/ABC Collector.vmdk
1
18.03.2021, 23:04

Теги

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