Возможно ли иметь пробелы bash в pwd?

Я хотел бы скопировать текущий каталог в буфер обмена, например: pwd | pbcopy. Однако pwdне выходит за пробел, поэтому что-то в «Поддержке приложений», например, не копируется правильно. Кажется, я не помню, чтобы это всегда было так, поэтому я мог что-то напутать. Использование iTerm2.

Есть ли настройка bash, чтобы избежать всего? проблемы с поиском, слишком много вопросов/тем о Spaces.app или esc.

Текущий:

$ pwd
/Library/Application Support/Google Earth/

Предпочтительно:

$ pwd
/Library/Application\ Support/Google\ Earth/

Уже видели сообщения: Копирование пути к текущему каталогу в буфер обмена и Как перейти к каталогу с именем, содержащим пробелы в bash? , которые не касаются этого. Я бы сделал комментарий в первом случае, но у меня нет привилегий.

Я сомневаюсь, что копия верна - вам нужна вставка для работы с пробелами - в какое приложение вы вставляете?
Отличный вопрос. Скоро у вас будет достаточно репутации, чтобы прокомментировать. Добро пожаловать на сайт!
pwd | pbcopyотлично работает для меня в терминале. Finder/Edit/Show Clipboard подтверждает, что все в порядке.
@lhf Да, нужно было проверить Терминал, который работает, как вы сказали. Однако в iTerm2 не повезло. Может быть, я должен переключиться обратно...
Как это может зависеть от используемого вами эмулятора терминала? Я только что проверил и pwd | pbcopyотлично работает в iTerm2.
@lhf да, по конвейеру копировать, работает. Я не смог объяснить суть проблемы: cd `pbpaste`дает мне неэкранированный пробел и, следовательно, cdне распознает каталог. И, вы правы, эмулятор терминала не имеет значения. Я не знаю, о чем я думал раньше, потому что в Терминале это работает не лучше. Должно быть, не было места.
Гренвар, см. мой ответ ниже. Короче говоря, просто добавьте двойные кавычки:cd "`pbpaste`"
Использование одинарных кавычек для строковых литералов кажется лучшим решением, я не понимаю, почему echo \'$(pbpaste)\'это не сработает.
Хорошо, у меня есть лучший вопрос, по какой причине вы используете pwd |pbcopy? Я примерно на 98% уверен, что есть лучшее решение.
ваше имя вопроса и вопрос не совпадают, я ответил на вопрос «Возможно ли иметь пробелы bash в pwd?» пожалуйста, отредактируйте вопрос или его название.

Ответы (3)

Эта команда будет правильно экранировать пробелы:

printf "%q\n" "$(pwd)" | pbcopy

Вы можете использовать псевдоним, используя что-то с историей, например cwd, если вы не против переопределить другой cwd

alias cwd='printf "%q\n" "$(pwd)" | pbcopy'

Переключите канал на pbcopy, если вы хотите, чтобы он работал больше как pwd, и просто распечатайте сбежавший путь.


Или, чтобы напечатать pwd, одновременно скопировав его в буфер обмена, используйте teeи подстановку процесса вывода:

alias cwd='printf "%q\n" "$(pwd)" | tee >(pbcopy)'
не работает на маке
Работает на моем Mac.
pwd | sed 's/ /\\ /g'

Но я не уверен, что это в конечном итоге решит вашу проблему. pbcopy копирует именно то, что он получает на стандартный ввод.

Это позволит избежать только пробелов, чего недостаточно, хотя это то, что ОП использовал в качестве примера.
но это работает в большинстве случаев правильный от glenn не сработал на моем маке, вообще нет вывода
Вы также можете использовать его как псевдоним при объявлении функции: function escapePWD() { pwd | sed 's/ /\\ /g'; } и используйте это для псевдонима: alias epwd='escapePWD'

Не существует встроенного способа создания pwdвыходных путей к файлам с экранированием, так как это обычно бесполезно.

Не имеет смысла добавлять обратную косую черту к копируемому pwd. pbcopyЕсли вы хотите скопировать путь в текстовый файл или веб-публикацию, вам не нужно вставлять в него обратную косую черту.

Вероятно, вы хотите создать отдельный псевдоним, например qwd, чтобы напечатать форму текущего каталога в кавычках, или просто избежать вывода pbpaste, что так же просто, как поместить его в двойные кавычки:

bash-3.2$ pwd
/Users/user
bash-3.2$ cd test\ dir/untitled\ \"folder/
bash-3.2$ pwd
/Users/user/test dir/untitled "folder
bash-3.2$ pwd | pbcopy
bash-3.2$ echo "`pbpaste`"
/Users/user/test dir/untitled "folder
bash-3.2$ cd
bash-3.2$ pwd
/Users/user
bash-3.2$ cd `pbpaste`
bash: cd: /Users/user/test: No such file or directory
bash-3.2$ cd "`pbpaste`"
bash-3.2$ pwd
/Users/user/test dir/untitled "folder

Обратите внимание, что экранировать нужно не только пробелы. Прямая и обратная косая черта, звездочка, вопросительный знак, амперсанд, точка с запятой и другие символы также нуждаются в экранировании. Безопаснее всего просто использовать двойные кавычки, как в примере, который будет работать, даже если путь включает в себя двойные кавычки.

Если вы хотите быть извращенным в этом, вы можете заставить AppleScript цитировать текущий каталог для вас:

bash-3.2$ alias qwd="osascript -e 'return quoted form of POSIX path of (POSIX file \"./\" as alias)'"
bash-3.2$ qwd
'/Users/user/test dir/untitled "folder'

В остальном я в основном согласен с Гленном, за исключением того, что, как указано выше, я бы назвал цитируемую форму псевдонимом, qwdчтобы не мешать нормальному pwd:

alias qwd='printf "%q\n" "$(pwd)"'