Почему я не могу записать цитированную тильду ('~')?

Для вас информация. Если у вас есть 64-битный процессор и только 64-битный репозиторий, у вас должна быть следующая строка в sources.list:

deb [arch=amd64] http://miktex.org/download/ubuntu xenial universe

Здесь [arch=amd64] сделал трюк.

Но texlive лучше.

31
задан 5 May 2018 в 17:36

16 ответов

Как заметил в своем ответе @karel, ~ является специальным символом и расширен Bash в домашний каталог текущего пользователя. См. Руководство Bash в разделе «Расширение тильды» или найдите заголовок «Расширение тильды» на странице руководства (man bash).

Любая цитата вокруг ~ предотвращает это расширение тильды. [ ! d2]

Чтобы ответить на ваш вопрос о том, как вы все еще можете использовать его для cd в каталоге с пробелами в его имени, существует несколько альтернатив:

Вместо этого пропустите кавычки и избегайте пробелов с помощью обратных косых черт:
cd ~/foo/spaces\ are\ cool/bar
Отметьте остальную часть пути, но опустите их вокруг тильды и первой косой черты:
cd ~/"foo/spaces are cool/bar"
Как вы видите, вы можете конкатенировать строки с кавычками и без кавычек в Bash, просто записывая их рядом друг с другом без пробелов между ними. Используйте переменную окружения $HOME вместо тильды, которая по-прежнему расширяется внутри «двойных кавычек» (но не «одинарные кавычки»):
cd "$HOME/foo/spaces are cool/bar"
76
ответ дан 22 May 2018 в 10:57
  • 1
    @rexkogitans ~'/...' не будет работать, и это не тот ответ. ~/'...' или ~/"..." будут работать. – hvd 5 May 2018 в 16:33
  • 2
    tld; dr: потому что этот синтаксис оболочки – Sergiy Kolodyazhnyy 5 May 2018 в 17:48
  • 3
    @hvd спасибо. Исправлена ​​опечатка. Это самый полный ответ, а также объясняет, как решить, что хочет сделать OP. ~/'path' - путь. – rexkogitans 5 May 2018 в 17:49
  • 4
    @hvd просто мало любопытства, почему бы ~'/...' не работать? Слэш не является особым персонажем, поэтому кажется, что он должен работать либо внутри, либо вне кавычек. – Kodos Johnson 5 May 2018 в 21:41
  • 5
    @ KodosJohnson Взгляните на раздел справочной информации Bash о «Расширение Тильды». Соответствующий абзац этого также приводится в ответе десерта ниже. TL; DR: Расширение Тильды происходит, если первый символ в слове является некотируемой тильдой, тогда все между этой тильдой и следующей неупорядоченной косой чертой считается префиксом «тильда». Если этот префикс недействителен, например, +, -, номер или имя пользователя (кавычки в них также не допускаются), расширение заканчивается, и вы получаете буквенный символ ~. – Byte Commander 5 May 2018 в 21:52

Как заметил в своем ответе @karel, ~ является специальным символом и расширен Bash в домашний каталог текущего пользователя. См. Руководство Bash в разделе «Расширение тильды» или найдите заголовок «Расширение тильды» на странице руководства (man bash).

Любая цитата вокруг ~ предотвращает это расширение тильды. [ ! d2]

Чтобы ответить на ваш вопрос о том, как вы все еще можете использовать его для cd в каталоге с пробелами в его имени, существует несколько альтернатив:

Вместо этого пропустите кавычки и избегайте пробелов с помощью обратных косых черт: cd ~/foo/spaces\ are\ cool/bar Отметьте остальную часть пути, но опустите их вокруг тильды и первой косой черты: cd ~/"foo/spaces are cool/bar" Как вы видите, вы можете конкатенировать строки с кавычками и без кавычек в Bash, просто записывая их рядом друг с другом без пробелов между ними. Используйте переменную окружения $HOME вместо тильды, которая по-прежнему расширяется внутри «двойных кавычек» (но не «одинарные кавычки»): cd "$HOME/foo/spaces are cool/bar"
77
ответ дан 17 July 2018 в 15:09

Как заметил в своем ответе @karel, ~ является специальным символом и расширен Bash в домашний каталог текущего пользователя. См. Руководство Bash в разделе «Расширение тильды» или найдите заголовок «Расширение тильды» на странице руководства (man bash).

Любая цитата вокруг ~ предотвращает это расширение тильды. [ ! d2]

Чтобы ответить на ваш вопрос о том, как вы все еще можете использовать его для cd в каталоге с пробелами в его имени, существует несколько альтернатив:

Вместо этого пропустите кавычки и избегайте пробелов с помощью обратных косых черт: cd ~/foo/spaces\ are\ cool/bar Отметьте остальную часть пути, но опустите их вокруг тильды и первой косой черты: cd ~/"foo/spaces are cool/bar" Как вы видите, вы можете конкатенировать строки с кавычками и без кавычек в Bash, просто записывая их рядом друг с другом без пробелов между ними. Используйте переменную окружения $HOME вместо тильды, которая по-прежнему расширяется внутри «двойных кавычек» (но не «одинарные кавычки»): cd "$HOME/foo/spaces are cool/bar"
77
ответ дан 20 July 2018 в 15:35

Как заметил в своем ответе @karel, ~ является специальным символом и расширен Bash в домашний каталог текущего пользователя. См. Руководство Bash в разделе «Расширение тильды» или найдите заголовок «Расширение тильды» на странице руководства (man bash).

Любая цитата вокруг ~ предотвращает это расширение тильды. [ ! d2]

Чтобы ответить на ваш вопрос о том, как вы все еще можете использовать его для cd в каталоге с пробелами в его имени, существует несколько альтернатив:

Вместо этого пропустите кавычки и избегайте пробелов с помощью обратных косых черт: cd ~/foo/spaces\ are\ cool/bar Отметьте остальную часть пути, но опустите их вокруг тильды и первой косой черты: cd ~/"foo/spaces are cool/bar" Как вы видите, вы можете конкатенировать строки с кавычками и без кавычек в Bash, просто записывая их рядом друг с другом без пробелов между ними. Используйте переменную окружения $HOME вместо тильды, которая по-прежнему расширяется внутри «двойных кавычек» (но не «одинарные кавычки»): cd "$HOME/foo/spaces are cool/bar"
77
ответ дан 23 July 2018 в 16:07

~ - специальный символ, который интерпретируется оболочкой как зарегистрированный в домашнем каталоге пользователя. '~' интерпретируется оболочкой как буквальный символ, а не как зарегистрированный домашний каталог пользователя, потому что включение строки внутри двух символов одиночной кавычки приводит к тому, что эта строка интерпретируется как буквальная текстовая строка.

17
ответ дан 22 May 2018 в 10:57
  • 1
    ~ не является псевдонимом в смысле bash интерпретирует его: Псевдонимы позволяют заменить строку на слово, когда оно используется как первое слово простой команды. . Как я объясняю в своем ответе ниже, это скорее расширение. – dessert 5 May 2018 в 14:38

Это функция bash, называемая расширением Тильды. Citation man bash:

Если слово начинается с символа без символа тильды (`~ '), все символы, предшествующие первому некотируемому косую черту (или все символы, если нет некорректной косой черты), считаются тильда-префикс. Если ни один из символов префикса тильды не указан, символы в тильде-префиксе, следующие за тильдой, рассматриваются как возможное имя входа. Если это имя входа является пустой строкой, тильда заменяется значением параметра shell HOME. Если HOME отключен, вместо него вместо этого заменяется домашний каталог пользователя, выполняющего оболочку.

Для расширения для работы тильда-символ ~ должен быть заблокирован, иначе символ берется буквально, а cd терпит неудачу, если в текущем каталоге отсутствует каталог с именем ~. См. man bash для объяснения цитирования в bash. Если вам нужно указать часть пути, вы можете:

указать, по крайней мере, символы, которые нуждаются в цитировании с одинарными кавычками, например.
~/dir' 'with' 'spaces/
или
~/'dir with spaces/'
цитируют, по крайней мере, символы, которые требуют цитирования с двойными кавычками, например.
~/dir" "with" "spaces/
или
~/"dir with spaces/"
цитируют только символы, которые требуют цитирования с обратными косыми чертами, например.
~/dir\ with\ spaces/

У Tilde Expansion есть еще несколько интересных функций, например:

~+ расширяется до значения PWD, т.е. текущий рабочий каталог ~- расширяется до значение OLDPWD, то есть предыдущий рабочий каталог ~john расширяется в домашний каталог, связанный с именем входа «john»
14
ответ дан 22 May 2018 в 10:57
  • 1
    Кстати, нормально «перевыпускать» и обратную косую черту; например, $ touch a; cd \a. (Я думал, что это может столкнуться с проблемами с cd \n, но эксперименты, по крайней мере, на моей версии bash, показывают, что это работает нормально.) – LSpice 7 May 2018 в 17:57

Исследуйте с помощью команды echo

Самый простой способ изучить, как все работает в bash с командой echo. В случае ~ используйте это:

$ echo ~
/home/rick
$ echo '~'
~
$ echo "~"
~
$ echo `~`
bash: /home/rick: Is a directory

Как вы можете видеть, когда вы указываете одиночную кавычку или используете двойные кавычки вокруг ~, она интерпретируется буквально как строка и не расширяется как переменная , Когда вы используете backticks (`), он выполняется как команда и генерирует сообщение об ошибке.

1
ответ дан 22 May 2018 в 10:57

Это функция bash, называемая расширением Тильды. Citation man bash:

Если слово начинается с символа без символа тильды (`~ '), все символы, предшествующие первому некотируемому косую черту (или все символы, если нет некорректной косой черты), считаются тильда-префикс. Если ни один из символов префикса тильды не указан, символы в тильде-префиксе, следующие за тильдой, рассматриваются как возможное имя входа. Если это имя входа является пустой строкой, тильда заменяется значением параметра shell HOME. Если HOME отключен, вместо него вместо этого заменяется домашний каталог пользователя, выполняющего оболочку.

Для расширения для работы тильда-символ ~ должен быть заблокирован, иначе символ берется буквально, а cd терпит неудачу, если в текущем каталоге отсутствует каталог с именем ~. См. [D2] man bash для объяснения цитирования в bash. Если вам нужно указать часть пути, вы можете:

указать, по крайней мере, символы, которые нуждаются в цитировании с одинарными кавычками, например. ~/dir' 'with' 'spaces/ или ~/'dir with spaces/' цитируют, по крайней мере, символы, которые требуют цитирования с двойными кавычками, например. ~/dir" "with" "spaces/ или ~/"dir with spaces/" цитируют только символы, которые требуют цитирования с обратными косыми чертами, например. ~/dir\ with\ spaces/

У Tilde Expansion есть еще несколько интересных функций, например:

~+ расширяется до значения PWD, т.е. текущий рабочий каталог ~- расширяется до значение OLDPWD, то есть предыдущий рабочий каталог ~john расширяется в домашний каталог, связанный с именем входа «john»
15
ответ дан 17 July 2018 в 15:09

~ - специальный символ, который интерпретируется оболочкой как зарегистрированный в домашнем каталоге пользователя. '~' интерпретируется оболочкой как буквальный символ, а не как зарегистрированный домашний каталог пользователя, потому что включение строки внутри двух символов одиночной кавычки приводит к тому, что эта строка интерпретируется как буквальная текстовая строка.

18
ответ дан 17 July 2018 в 15:09

Исследуйте с помощью команды echo

Самый простой способ изучить, как все работает в bash с командой echo. В случае ~ используйте это:

$ echo ~ /home/rick $ echo '~' ~ $ echo "~" ~ $ echo `~` bash: /home/rick: Is a directory

Как вы можете видеть, когда вы указываете одиночную кавычку или используете двойные кавычки вокруг ~, она интерпретируется буквально как строка и не расширяется как переменная , Когда вы используете backticks (`), он выполняется как команда и генерирует сообщение об ошибке.

1
ответ дан 17 July 2018 в 15:09

Это функция bash, называемая расширением Тильды. Citation man bash:

Если слово начинается с символа без символа тильды (`~ '), все символы, предшествующие первому некотируемому косую черту (или все символы, если нет некорректной косой черты), считаются тильда-префикс. Если ни один из символов префикса тильды не указан, символы в тильде-префиксе, следующие за тильдой, рассматриваются как возможное имя входа. Если это имя входа является пустой строкой, тильда заменяется значением параметра shell HOME. Если HOME отключен, вместо него вместо этого заменяется домашний каталог пользователя, выполняющего оболочку.

Для расширения для работы тильда-символ ~ должен быть заблокирован, иначе символ берется буквально, а cd терпит неудачу, если в текущем каталоге отсутствует каталог с именем ~. См. [D2] man bash для объяснения цитирования в bash. Если вам нужно указать часть пути, вы можете:

указать, по крайней мере, символы, которые нуждаются в цитировании с одинарными кавычками, например. ~/dir' 'with' 'spaces/ или ~/'dir with spaces/' цитируют, по крайней мере, символы, которые требуют цитирования с двойными кавычками, например. ~/dir" "with" "spaces/ или ~/"dir with spaces/" цитируют только символы, которые требуют цитирования с обратными косыми чертами, например. ~/dir\ with\ spaces/

У Tilde Expansion есть еще несколько интересных функций, например:

~+ расширяется до значения PWD, т.е. текущий рабочий каталог ~- расширяется до значение OLDPWD, то есть предыдущий рабочий каталог ~john расширяется в домашний каталог, связанный с именем входа «john»
15
ответ дан 20 July 2018 в 15:35
  • 1
    Кстати, нормально «перевыпускать» и обратную косую черту; например, $ touch a; cd \a. (Я думал, что это может столкнуться с проблемами с cd \n, но эксперименты, по крайней мере, на моей версии bash, показывают, что это работает нормально.) – LSpice 7 May 2018 в 17:57

~ - специальный символ, который интерпретируется оболочкой как зарегистрированный в домашнем каталоге пользователя. '~' интерпретируется оболочкой как буквальный символ, а не как зарегистрированный домашний каталог пользователя, потому что включение строки внутри двух символов одиночной кавычки приводит к тому, что эта строка интерпретируется как буквальная текстовая строка.

18
ответ дан 20 July 2018 в 15:35
  • 1
    ~ не является псевдонимом в смысле bash интерпретирует его: Псевдонимы позволяют заменить строку на слово, когда оно используется как первое слово простой команды. . Как я объясняю в своем ответе ниже, это скорее расширение. – dessert 5 May 2018 в 14:38

Исследуйте с помощью команды echo

Самый простой способ изучить, как все работает в bash с командой echo. В случае ~ используйте это:

$ echo ~ /home/rick $ echo '~' ~ $ echo "~" ~ $ echo `~` bash: /home/rick: Is a directory

Как вы можете видеть, когда вы указываете одиночную кавычку или используете двойные кавычки вокруг ~, она интерпретируется буквально как строка и не расширяется как переменная , Когда вы используете backticks (`), он выполняется как команда и генерирует сообщение об ошибке.

1
ответ дан 20 July 2018 в 15:35

Это функция bash, называемая расширением Тильды. Citation man bash:

Если слово начинается с символа без символа тильды (`~ '), все символы, предшествующие первому некотируемому косую черту (или все символы, если нет некорректной косой черты), считаются тильда-префикс. Если ни один из символов префикса тильды не указан, символы в тильде-префиксе, следующие за тильдой, рассматриваются как возможное имя входа. Если это имя входа является пустой строкой, тильда заменяется значением параметра shell HOME. Если HOME отключен, вместо него вместо этого заменяется домашний каталог пользователя, выполняющего оболочку.

Для расширения для работы тильда-символ ~ должен быть заблокирован, иначе символ берется буквально, а cd терпит неудачу, если в текущем каталоге отсутствует каталог с именем ~. См. [D2] man bash для объяснения цитирования в bash. Если вам нужно указать часть пути, вы можете:

указать, по крайней мере, символы, которые нуждаются в цитировании с одинарными кавычками, например. ~/dir' 'with' 'spaces/ или ~/'dir with spaces/' цитируют, по крайней мере, символы, которые требуют цитирования с двойными кавычками, например. ~/dir" "with" "spaces/ или ~/"dir with spaces/" цитируют только символы, которые требуют цитирования с обратными косыми чертами, например. ~/dir\ with\ spaces/

У Tilde Expansion есть еще несколько интересных функций, например:

~+ расширяется до значения PWD, т.е. текущий рабочий каталог ~- расширяется до значение OLDPWD, то есть предыдущий рабочий каталог ~john расширяется в домашний каталог, связанный с именем входа «john»
15
ответ дан 23 July 2018 в 16:07
  • 1
    Кстати, нормально «перевыпускать» и обратную косую черту; например, $ touch a; cd \a. (Я думал, что это может столкнуться с проблемами с cd \n, но эксперименты, по крайней мере, на моей версии bash, показывают, что это работает нормально.) – LSpice 7 May 2018 в 17:57

~ - специальный символ, который интерпретируется оболочкой как зарегистрированный в домашнем каталоге пользователя. '~' интерпретируется оболочкой как буквальный символ, а не как зарегистрированный домашний каталог пользователя, потому что включение строки внутри двух символов одиночной кавычки приводит к тому, что эта строка интерпретируется как буквальная текстовая строка.

18
ответ дан 23 July 2018 в 16:07
  • 1
    ~ не является псевдонимом в смысле bash интерпретирует его: Псевдонимы позволяют заменить строку на слово, когда оно используется как первое слово простой команды. . Как я объясняю в своем ответе ниже, это скорее расширение. – dessert 5 May 2018 в 14:38

Исследуйте с помощью команды echo

Самый простой способ изучить, как все работает в bash с командой echo. В случае ~ используйте это:

$ echo ~ /home/rick $ echo '~' ~ $ echo "~" ~ $ echo `~` bash: /home/rick: Is a directory

Как вы можете видеть, когда вы указываете одиночную кавычку или используете двойные кавычки вокруг ~, она интерпретируется буквально как строка и не расширяется как переменная , Когда вы используете backticks (`), он выполняется как команда и генерирует сообщение об ошибке.

1
ответ дан 23 July 2018 в 16:07

Другие вопросы по тегам:

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