В Windows я создал файл с именем mingw64_open_with.cmd
и связанные с ним файлы .sh bash, чтобы они открывались вместе с ним, цель состоит в том, чтобы иметь возможность дважды щелкнуть сценарии .sh bash в Windows, чтобы запустить их через MinGW. Это мой скрипт .cmd:
@echo off
C:\msys\usr\bin\env.exe MSYSTEM=MINGW64 c:\msys\usr\bin\bash.exe -l -c "cd $(dirname "%1") && "%1""
Он работает отлично, если путь к скрипту .sh, который находится здесь %1
, не содержит пробелов. Когда это произойдет, я получу это: c:\msys\usr\bin\bash: line 1: cd: too many arguments
. Ничто из того, что я пробовал, например удвоение "
, не решило проблему, я не знаю, что делать.
Для вашей конкретной задачи вам может помочь простая замена %1
на %*
.
Попробуйте cd "$(dirname "%1")"
.
@SomethingDark с одним ^
я все равно получаю cd: too many arguments
, а с ^^
я получаю bash: -c: line 2: unexpected EOF while looking for matching
)'` @Compo Нет, я все равно получаю ` cd: слишком много аргументов` @RenaudPacalet Думаю, вы предлагаете удалить пару "
, но тогда Я не смог выполнить остальную часть команды.
Можете ли вы ответить на вопрос, который еще никто не задавал? Если вы хотите запустить двойной щелчок по bash-скрипту mingw64_open_with.cmd
, вам нужно точно указать команду, которая запускается при этом, и метод реализации. Нам необходимо иметь возможность воспроизвести вашу среду и результат, чтобы предложить целенаправленную помощь.
@Compo, это обычная вещь для Windows, когда вы связываете тип файла с .cmd или .exe с помощью «Открыть с помощью...», путь к открываемому файлу — %1
. Например, если мой файл .cmd содержит echo %1
, он будет напечатан "D:\Virtual Machines\QEMU\QEMU machines\launch_vm.sh"
, когда я дважды щелкну этот файл. Обновлено: проблема решена, см. ответ ниже, спасибо всем за ваши усилия.
Вы не ответили на мой вопрос. Если вы создали ассоциацию файлов для файла .sh, то при этом вы должны ввести команду для запуска такой ассоциации. Если бы вместо этого вы создали запись типа контекстного меню (что, по моему мнению, было бы лучше), тогда вы бы создали команду, которая будет запускаться при вызове. Нам нужна эта команда, чтобы полностью соответствовать вашей среде и предложить вам наиболее надежное решение. В настоящее время, даже несмотря на опубликованный и принятый ответ, наши читатели могут только догадываться, как вызвать командный файл (который для этого даже не требуется), так же, как и вы.
@Compo Я не знаю, о чем вы говорите, в Windows «Открыть с помощью...» работает не так. Файлы .sh теперь связаны с моим сценарием .cmd, вот и все.
Есть командная запись, не возмутительно спросить, что это за запись и как вы ее создали. Кроме того, зачем связывать каждый файл .sh с одним пакетным файлом? А как насчет создания записи контекстного меню с C:\msys\usr\bin\env.exe
в качестве исполняемого файла и добавлением к нему ваших параметров и аргументов?
Это работает для меня:
C:\msys\usr\bin\env.exe MSYSTEM=MINGW64 c:\msys\usr\bin\bash.exe -l -c "cd \"$(dirname \"$1\")\"; \"$1\"" sh %1
Я подтверждаю, что это работает и для меня, спасибо!
У меня не установлен Mingw64, поэтому я не могу это проверить, но поскольку пакетная обработка сначала обрабатывает эту строку, она читает
"cd $(dirname "
в качестве аргумента, затем%1
, затем") && "
, затем%1
, затем""
. Поскольку пакет не может обрабатывать вложенные двойные кавычки, как это делает bash, вам придется сначала экранировать внутренние кавычки с помощью^
. Попробуйте-c "cd $(dirname ^"%1^") && ^"%1^""
и посмотрите, сработает ли это. Возможно, вам придется использовать^^
вместо^
.