как unix обрабатывает полное имя пути с пробелом и аргументами? - PullRequest
23 голосов
/ 09 сентября 2008

Как unix обрабатывает полный путь с пробелом и аргументами?
В Windows мы указываем путь и добавляем аргументы командной строки после, как это в Unix?

 "c:\foo folder with space\foo.exe" -help

Обновление:

Я имел в виду, как распознать путь из аргументов командной строки.

Ответы [ 7 ]

38 голосов
/ 09 сентября 2008

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

 "/foo folder with space/foo" --help
 /foo\ folder\ with\ space/foo --help
9 голосов
/ 09 сентября 2008

Вы можете заключить в кавычки, если хотите, или можете избежать пробелов с предыдущим \, но большинство путей UNIX (за исключением Mac OS X) не содержат пробелов.

/Applications/Image\ Capture.app/Contents/MacOS/Image\ Capture

"/Applications/Image Capture.app/Contents/MacOS/Image Capture"

/Applications/"Image Capture.app"/Contents/MacOS/"Image Capture"

Все ссылаются на один и тот же исполняемый файл под Mac OS X.

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

3 голосов
/ 09 сентября 2008

Поскольку пробелы используются для разделения аргументов командной строки, их необходимо экранировать из оболочки. Это можно сделать с помощью обратной косой черты () или кавычек:

"/path/with/spaces in it/to/a/file"
somecommand -spaced\ option
somecommand "-spaced option"
somecommand '-spaced option'

Предполагается, что вы работаете из оболочки. Если вы пишете код, вы обычно можете передавать аргументы напрямую, избегая проблемы:

Пример в perl. Вместо того, чтобы делать:

print("code sample"); system («опция somecommand -spaced»);

вы можете сделать

print("code sample"); system ("somecommand", "-spaced option");

Поскольку при передаче вызова system () список не разбивает аргументы в пробелах, как при вызове одного аргумента.

1 голос
/ 09 сентября 2008

Также будьте осторожны с двойными кавычками - в оболочке Unix это расширяет переменные. Некоторые очевидны (например, $foo и \t), но некоторые нет (например, !foo).

В целях безопасности используйте одинарные кавычки!

1 голос
/ 09 сентября 2008

Вы можете указать весь путь, как в Windows, или вы можете избежать пробелов, как в:

/foo\ folder\ with\ space/foo.sh -help

Оба способа будут работать!

0 голосов
/ 03 января 2017

Я также хотел бы отметить, что если вы используете аргументы командной строки как часть сценария оболочки (файл .sh), то в сценарии вам необходимо заключить аргумент в кавычки. Так что если ваша команда выглядит как

>scriptName.sh arg1 arg2

И arg1 - это ваш путь с пробелами, тогда в скрипте оболочки вам нужно будет называть его "$ arg1" вместо $ arg1

Вот подробности

0 голосов
/ 02 апреля 2015

Если обычные способы не работают, попробуйте заменить пробелы на %20.

Это сработало для меня при работе с SSH и другими командами в стиле домена, такими как auto_smb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...