Исторически сложилось так, что команда 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
)... где он будет лежать, забытый, до конца времен, если остальная часть программного обеспечения для передачи почты не будет активирована, так как процесс, который должен периодически проверять очередь почты, не будет запущен.
Вам не нужно экранировать пробелы, если они являются результатом раскрытия в кавычках.
$ 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
См.:
Пробелы в именах файлов будут вас ненавидеть, и вы будете их ненавидеть, особенно когда они передаются из имен файлов в 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