2016-07-22 4 views
1

У меня есть проблема, и я пробовал несколько способов исправить это, но я не могу показаться.Сценарий Ubuntu Bash, выполняющий команду с пробелами

Итак, у меня есть два сценария оболочки.

background.sh: Выполняет заданную команду в фоновом режиме и выводит перенаправление.

#!/bin/bash 

if test -t 1; then 
    exec 1>/dev/null 
fi 

if test -t 2; then 
    exec 2>/dev/null 
fi 

"[email protected]" & 

main.sh: Этот файл просто запускает эмулятор (genymotion) в качестве фонового процесса.

#!/bin/bash 
GENY_DIR="/home/user/Documents/MyScript/watchdog/genymotion" 
BK="$GENY_DIR/background.sh" 
DEVICE="164e959b-0e15-443f-b1fd-26d101edb4a5" 
CMD="$BK player --vm-name $DEVICE" 
$CMD 

Это прекрасно работает, когда у меня нет пробелов в моем каталоге. Однако, когда я пытаюсь сделать это: GENY_DIR="home/user/Documents/My Script/watchdog/genymotion"

, которого у меня нет на данный момент. Я получаю сообщение о том, что файл или каталог не найдены. Я попытался поместить "$CMD" в цитату, но это не сработало.

Вы можете проверить это, пытаясь запустить что-либо в качестве фонового процесса, не обязательно быть эмулятором.

Любые консультации или отзывы будут оценены. Я тоже пытался это сделать.

BK="'$BK'"

или

BK="\"$BK\""

или

BK=$(echo "$BK" | sed 's/ /\\ /g')

+0

Ваш каталог, который может иметь пустые места, присваивается вашей переменной 'GENY_DIR', поэтому я думаю, что при цитировании' CMD' он не имеет никакого эффекта. Вы пытались процитировать свой '$ {GENY_DIR}' и посмотреть, как он себя ведет? – ODelibalta

+0

Спасибо, ребята, храня его в массиве, как это предложил @that, другой парень работал как шарм :) – codeCompiler77

ответ

4

Не пытайтесь команд хранить в строках. Используйте массивы вместо:

#!/bin/bash 
GENY_DIR="$HOME/Documents/My Script/watchdog/genymotion" 
BK="$GENY_DIR/background.sh" 
DEVICE="164e959b-0e15-443f-b1fd-26d101edb4a5" 
CMD=("$BK" "player" --vm-name "$DEVICE") 
"${CMD[@]}" 

Массивы правильно сохранить свои границы слов, так что один аргумент с пробелами остается один аргумент с пробелами.

Из-за того, что расщепление слов работает, добавление буквальной обратной косой черты перед кавычками или пробелами вокруг пространства не будет иметь полезного эффекта.

John1024 предлагает хороший источник для дополнительного чтения: I'm trying to put a command in a variable, but the complex cases always fail!

+0

'./main.sh: строка 5: 'home/user/Documents/My Script/watchdog/genymotion/background.sh ': Нет такого файла или каталога' - это сообщение об ошибке, возвращаемое при попытке запуска в виде массива. Я подтвердил, что файл существует :) – codeCompiler77

+0

Я скопировал ваш код, я не знаю, где ваши файлы. Вы уверены, что перед этим не должно было быть '/'? –

+0

Да, извините, есть '/' перед домом, я использую переменную $ HOME, но я набрал ее для этого. – codeCompiler77

-2

попробовать это:

GENY_DIR="home/user/Documents/My\ Script/watchdog/genymotion" 

Вы можете избежать пространство с помощью обратной косой черты.

+0

'./main.sh: строка 5: '/ home/user/Documents/My \: нет такого файла или каталога' – codeCompiler77

Смежные вопросы