Расширение тильды определяется POSIX как:
А «тильда-префикс» не состоит из некотируемого <тильды> символа в начале слова, после чего всех символов , предшествующих первого без кавычек <слэша> в слове, или все символы в слове , если нет < слэш>. В назначении можно использовать несколько префиксов тильды: [...] после <знака равенства> назначения, после любого <двоеточия> без кавычек или обоих. [...] Если ни один из символов в префиксе тильды не заключен в кавычки, символы в префиксе тильды, следующие за <тильдой>, рассматриваются как возможное имя для входа в систему из пользовательской базы данных. [...] Если имя для входа в систему равно нулю (т. Е. Префикс тильды содержит только тильду), префикс тильды заменяется значением переменной HOME. Если HOME не установлен, результаты не уточняются. [...]
Таким образом, самый короткий ответ «потому что он определен таким образом»: цитирование любого из символов в префиксе, в том числе ~
, запрещает расширение.
Он также определяет расширение как всегда приводящее к одному слову, поэтому в кавычках нет необходимости:
Имя пути, полученное в результате расширения тильды, должно обрабатываться так, как если бы оно было заключено в кавычки, чтобы предотвратить его изменение в результате разделения поля и расширения имени пути.
Если для некоторого пути требуется цитирование, а для остального - префикс тильды, вы можете напрямую объединить расширение тильды и обычное цитирование:
$ cat ~/"file name with spaces"
В более широком смысле «почему»: поскольку для разделения слов не существует мыслимого использования ~
, это должно быть поведение по умолчанию, а не требование его заключать в кавычки. Поскольку нет необходимости ~
заключать его в кавычки, придание особого значения внутри кавычек было бы ненужным осложнением. И, конечно же, исторические причины означают, что его нельзя изменить сейчас, даже если это было бы желательно.