Ответ 1
Вы можете либо процитировать его, как ваш пример с Windows выше, либо избежать пробелов с помощью обратных косых черт:
"/foo folder with space/foo" --help
/foo\ folder\ with\ space/foo --help
Как unix обрабатывает полное имя пути с пространством и аргументами?
В окнах мы указываем путь и добавляем аргументы командной строки, как это делается в unix?
"c:\foo folder with space\foo.exe" -help
обновление:
Я имел в виду, как узнать путь из аргументов командной строки.
Вы можете либо процитировать его, как ваш пример с Windows выше, либо избежать пробелов с помощью обратных косых черт:
"/foo folder with space/foo" --help
/foo\ folder\ with\ space/foo --help
Вы можете процитировать, если хотите, или вы можете избежать пробелов с предыдущим \, но большинство путей 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.
Я не уверен, что вы имеете в виду для распознавания пути - если какой-либо из вышеперечисленных путей передается в качестве параметра в программу, оболочка помещает всю строку в одну переменную - вам не нужно разбирать несколько аргументов чтобы получить весь путь.
Поскольку для разделения аргументов командной строки используются пробелы, они должны быть экранированы из оболочки. Это можно сделать либо с помощью обратной косой черты(), либо с кавычками:
"/path/with/spaces in it/to/a/file"
somecommand -spaced\ option
somecommand "-spaced option"
somecommand '-spaced option'
Предполагается, что вы работаете из оболочки. Если вы пишете код, вы можете просто передать аргументы напрямую, избегая проблемы:
Пример в perl. Вместо этого:
print("code sample");
(опция "somecommand -spaced" );
вы можете сделать
print("code sample");
( "somecommand", "-spaced option" );
Поскольку, когда вы передаете вызов system(), он не разбивает аргументы на пробелы, как это происходит с помощью одного вызова аргумента.
Вы можете процитировать весь путь, как в окнах, или вы можете избежать пробелов, таких как:
/foo\ folder\ with\ space/foo.sh -help
Оба способа будут работать!
Также будьте осторожны с двойными кавычками - в оболочке Unix это расширяет переменные. Некоторые из них очевидны (например, $foo
и \t
), но некоторые из них (например, !foo
).
Для обеспечения безопасности используйте одиночные кавычки!
Если обычные способы не работают, попробуйте заменить пробелы на %20
.
Это работало для меня при работе с SSH и другими командами в стиле домена, например auto_smb
.
Я также хотел бы отметить, что если вы используете аргументы командной строки как часть оболочки script (файл .sh), то в script вам нужно будет заключить аргумент в кавычки. Поэтому, если ваша команда выглядит как
>scriptName.sh arg1 arg2
И arg1 - это ваш путь, который имеет пробелы, а затем внутри оболочки script, вам нужно будет ссылаться на него как "$ arg1" вместо $arg1