@4ainik
начинал с бейсика на 286 в 1994

Почему параметры командной строки ломаются, если на конце у них слеш?

Наткнулся на очень интересный случай, по моему это баг в чистом виде, но очень редкий и трудно выявляемый.
Основная суть в том, что вызывается программа/скрипт с передачей параметров, содержащих пробелы, заключенных в двойные кавычки. При этом если параметр содержит конечный слэш (в windows стиле!), то происходит сбой при разборе параметров на уровне интерпретаторов ruby/php, а может и у бинарников такая же проблема?!
php script.php "param1 with space and leading slash\" "param2 with space too"

ruby script.rb "param1 with space and leading slash\" "param2 with space too"


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

Проверил на бинарнике, та же еруда. Причем можно было бы ожидать чего угодно только не такого:

C:\cmd_line_test>
cmd_line_test.exe "param1 with space and leading slash\" "param2 with space too"
argc=5
argv[0]=|C:\cmd_line_test\cmd_line_test.exe|
argv[1]=|param1 with space and leading slash" param2|
argv[2]=|with|
argv[3]=|space|
argv[4]=|too|


Допустим слеш используется для ескейпа, но этож бред?! Если все пути в винде используются с такими слешами "\", то это же должен быть высоко-интелектуальный интерпретатор с эскейпом?!
При этом самое смешное, что в этом случае получается ни два ни полтора, точнее как раз полтора и выходит, потому что если уж на то пошло то именно строка
param1 with space and leading slash\"
должна быть первым аргументом, если принять во внимание и за правило эскейпа
\"
?!
  • Вопрос задан
  • 503 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Free_ze
Пишу комментарии в комментарии, а не в ответы
конечный слэш (в windows стиле!)

Это называется обратный слэш/бекслэш.

потому что если уж на то пошло то именно строка

param1 with space and leading slash\"

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


Про эскейп вы поняли верно. Но:
  • Первый аргумент - это всегда имя файла программы
  • Второй аргумент слился воедино с param2 не смотря на кавычки потому, что param2 стоит вплотную, между аргументами нет разделителя-пробела. Пробел в кавычках - это часть предыдущего аргумента

.

это же должен быть высоко-интелектуальный интерпретатор с эскейпом?!

Мысли читать должен?)
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
test.cmd:
@echo %1
@echo %2

test.cmd "param1 with space and leading slash\" "param2 with space too"
"param1 with space and leading slash\"
"param2 with space too"


программу ... глюки
С программой тоже нет ошибок:
program Project1;
{$APPTYPE CONSOLE}
uses System.SysUtils;
  var i: Integer;
begin
  for i := 0 to ParamCount do Writeln( ParamStr(i) ); // uses GetCommandLineW
end.

Project1.exe  "param1 with space and leading slash\" "param2 with space too"
Project1.exe
param1 with space and leading slash\
param2 with space too
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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