简体   繁体   中英

Ubuntu Bash Script executing a command with spaces

I have a bit of an issue and i've tried several ways to fix this but i can't seem to.

So i have two shell scripts.

background.sh : This runs a given command in the background and redirect's output.

#!/bin/bash

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

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

"$@" &

main.sh : This file simply starts the emulator (genymotion) as a background process.

#!/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

This works fine when i have NO spaces in my directory. However, when i try to do: GENY_DIR="home/user/Documents/My Script/watchdog/genymotion"

which i have no choice at the moment. I get an error saying that the file or directory cannot be found. I tried to put "$CMD" in quote but it didn't work.

You can test this by trying to run anything as a background process, doesn't have to be an emulator.

Any advice or feedback would be appreciated. I also tried to do.

BK="'$BK'"

or

BK="\\"$BK\\""

or

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

Don't try to store commands in strings. Use arrays instead:

#!/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[@]}"

Arrays properly preserve your word boundaries, so that one argument with spaces remains one argument with spaces.

Due to the way word splitting works, adding a literal backslash in front of or quotes around the space will not have a useful effect.

John1024 suggests a good source for additional reading: I'm trying to put a command in a variable, but the complex cases always fail!

try this:

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

You can escape the space with a backslash.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM