Я разрабатываю сценарий bash в Windows 7, используя терминал, эмулирующий bash, именно я использую терминал bash в MobaXterm 9.1. Причина в том, что у меня ноутбук с Windows 7, но мой сценарий в конечном итоге будет работать на Jenkins Linux Server.
Пробелы и / или (в пути препятствуют успешному выполнению моего сценария.
Мой сценарий:
#!/bin/bash
eclexe0="C:\Program Files (x86)\HPCCSystems\6.0.4\clienttools\bin\ecl.exe"
eclexe1="/drives/c/Program Files (x86)/HPCCSystems/6.0.4/clienttools/bin/ecl.exe"
clear
#1
echo "Testing if ecl.exe is available..."
if [ -f "$eclexe0" ]; then
echo "FOUND." >&2
else
echo "NOT FOUND." >&2
exit 1
fi
echo "Executing ecl.exe"
echo 1
eval "$eclexe0"
echo 2
Когда я запускаю его, вывод будет
Как вы можете видеть, сценарий не доволен путем C: \ Program Files (x86) . Если я переместу файлы на другой путь (C: \ oscar \ eclfolder), это сработает. Я попробовал ответы здесь , но они, вероятно, не работают потому что у меня Windows 7 ...
Как мне заставить этот скрипт работать?
Ваш сценарий не соответствует ' t работает, потому что вы запускаете eval
на пути к исполняемому файлу.
В любом сценарии оболочки вы уже можете использовать переменную, чтобы указать команду для запуска.
Если вы не процитируете ссылку на $ variable
, содержимое переменной также будет разделено на отдельные слова в соответствии с пробелами.
Вы процитировали ссылку на переменную. Однако, запустив eval
, вы анализируете результат раскрытия переменной за секунду раз. Тебе это не нужно.
Следующая иллюстрация может быть поучительной:
$ ls
file.txt file2.txt
$ somevar=ls
$ $somevar
file.txt file2.txt
$ ls -l
total 0
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file.txt
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file2.txt
$ somevar='ls -l'
$ $somevar
total 0
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file.txt
-rw-r--r-- 1 Me staff 0 Sep 2 16:06 file2.txt
$ "$somevar"
bash: ls -l: command not found
$
Как видите, когда я пытаюсь запустить "ls -l"
, процитированный, оболочка ищет команду с таким точным имя - включая пробелы.
В моем примере это не то, что я хочу.
Однако в вашем примере это - это то, что вы хотите.
Вместо использования eval «$ eclexe0»
просто используйте «$ eclexe0»
.
The Bigger Picture
Бесплатный совет: если вы планируете запускать свой сценарий на компьютере с Linux, протестируйте его на компьютере с Linux. MobaXterm - это не Linux.
Установите Vagrant и VirtualBox (которые бесплатны) и создайте виртуальную машину, на которой вы сможете проводить тесты.
Дополнительная литература:
Вам, вероятно, нужно избегать таких кавычек ("\" строка "\") в соответствии с этим сообщением: https://stackoverflow.com/questions/5253782/bash-problem-with-eval-variables -and-quotes