Я ходил по цитатам на http://tldp.org для bash и гуглил, пока у меня не посинело лицо. Я также попробовал все очевидные схемы цитирования для этой проблемы, но пока ничего не работает.
Проблема, похоже, заключается в том, что пробел внутри аргумента в кавычках в команде, выполняемой в конце скрипта, интерпретируется как разделитель, а не как пробел в кавычках.
Вот мой сценарий (я прекрасно знаю, что я новичок, поэтому я буду учиться комментировать мой стиль и / или необязательный синтаксис):
#!/bin/bash
date=`date`
args="$@"
MSEND_HOME=/home/patrol/Impact #Path to the Impact Directory
integrationName=Introscope #Name of the integration
persistEnabled=1 #1 for Yes, 0 for No
persist=""
bufDir=$MSEND_HOME/tmp/$integrationName #DO NOT CHANGE
cellName=linuxtest #Cell name to forward events to
loggingEnabled=1 #1 for Yes, 0 for No
logFile=$MSEND_HOME/log/$integrationName.$cellName.log
die () {
if [ $loggingEnabled -eq 1 ]
then
echo >>$logFile "$@"
fi
exit 1
}
[ "$#" -ge 1 ] || die "$date - At least 1 argument required, $# provided" "$@"
# This is where you would parse out your arguments and form the following
# slots as a minimum for sending an event.
class=$2
msg=\"$3\"
# Parse the first argument and assign the correct syntax
if [[ $1 == "INFORMATIONAL" ]]
then
severity=INFO
elif [[ $1 == "WARN" ]]
then
severity=WARNING
elif [[ $1 == "CRIT" ]]
then
severity=CRITICAL
else
severity=INFO
fi
#Additional slots can be set, parse them all in this variable;
#e.g., additionalSlots="slot1=value1;slot2=value2;slot3=\"value 3\""
additionalSlots=""
cmd="$MSEND_HOME/bin/msend"
cmd="$cmd -q"
cmd="$cmd -l $MSEND_HOME"
if [ $persistEnabled -eq 1 ]
then
cmd="$cmd -j $bufDir"
fi
cmd="$cmd -n $cellName"
cmd="$cmd -a $class"
cmd="$cmd -m $msg"
cmd="$cmd -r $severity"
if [ $additionalSlots ]
then
cmd="$cmd -b $additionalSlots"
fi
$cmd || die "$date - msend exited with error $? | Original arguments: $args | Command: $cmd"
#echo "msend exited with error $? | Original arguments: $args | Command: $cmd"
Сценарий выполняется так:
./sendEvent.sh "CRIT" "EVENT" "Test Event"
Ошибка, которую я получаю от исполняемого файла msend, состоит в том, что аргументы неверны, но я записываю командную строку целиком в файл, и когда я в интерактивном режиме запускаю эту зарегистрированную команду в оболочке, она работает.
Вот вывод журнала:
Tue Oct 4 20:31:29 CDT 2011 - msend exited with error 27 | Original arguments: CRIT EVENT Test Event | Command: /home/patrol/Impact/bin/msend -q -l /home/patrol/Impact -j /home/patrol/Impact/tmp/Introscope -n linuxtest -a EVENT -m "Test Event" -r CRITICAL
Так что, если я вставлю /home/patrol/Impact/bin/msend -q -l /home/patrol/Impact -j /home/patrol/Impact/tmp/Introscope -n linuxtest -a EVENT -m "Test Event" -r CRITICAL
и запусту его, он будет работать.
Если я запускаю скрипт как ./sendEvent.sh "CRIT" "EVENT" "TestEvent"
, он работает. Но мне нужен этот аргумент, чтобы разрешить пробелы.
Я на пути к тому, что это проблема $ IFS или что-то в этом роде ... возможно, разница между интерактивной оболочкой и средой сценариев.
Буду признателен за понимание более умных людей, чем я!
tl; dr - Моя команда не работает при запуске из скрипта, но работает, когда синтаксис зарегистрированной команды используется в интерактивной оболочке.