Подтвердить что ты не робот

Как unix обрабатывает полное имя пути с пространством и аргументами?

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

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

обновление:

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

4b9b3361

Ответ 1

Вы можете либо процитировать его, как ваш пример с Windows выше, либо избежать пробелов с помощью обратных косых черт:

 "/foo folder with space/foo" --help
 /foo\ folder\ with\ space/foo --help

Ответ 2

Вы можете процитировать, если хотите, или вы можете избежать пробелов с предыдущим \, но большинство путей 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

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

"/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(), он не разбивает аргументы на пробелы, как это происходит с помощью одного вызова аргумента.

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

>scriptName.sh arg1 arg2

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

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