Команда curl не работает из сценария оболочки, но отлично работает на сайте - PullRequest
0 голосов
/ 18 октября 2018

Я борюсь с небольшим сценарием оболочки bash, который должен перечислять мои csv-файлы и загружать их во внешний Сервис, используя curl.когда я передаю свою командную переменную в консоль и выполняю ее, я работаю нормально, но когда я выполняю ее в своем скрипте, он жалуется на дополнительную qouta "

мой скрипт выглядит так

#!/usr/bin/bash
LOGDIR="/var/log/tyk/"
FILE_EXSTENSION_NAME="*.csv"
CURLCMD="curl -k -i -H"
PORT="9992"
ENDPOINT="/endpoint"
URL="https://localhost"



for i in `ls $LOGDIR$FILE_EXSTENSION_NAME`; do
    filename=`echo $i | awk -F "/" ' { print $5 }'`
    echo $filename
    CMD="$CURLCMD \"filename: $filename\" -F \"data=@$LOGDIR$filename\" $URL:$PORT$ENDPOINT"
    $CMD
done

Когда я запускаю его, я получаю следующие выходные данные

% Total    % Received % Xferd  Average Speed   Time    Time     Time     Current
                             Dload  Upload   Total   Spent    Left  Speed
 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--0curl: (6) Could not resolve host: 2018-October-18-10.csv"; Unknown error
 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--      0     
curl: (26) couldn't open file "/var/log/tyk/2018-October-18-10.csv""

Если я выполняю echo $ CMD в моем скрипте, я получаю

curl -k -i -H "filename: 2018-October-18-10.csv" -F "data=@/var/log/tyk/2018-October-18-10.csv" https://localhost:9992/endpoint

, и это работает нормально

Я не могувыяснить, что я не делаю неправильно

1 Ответ

0 голосов
/ 18 октября 2018

Прежде всего, не храните команды в переменных.Кроме того, есть две проблемы:

  1. Кавычки внутри раскрываемых переменных не работают так, как если бы вы их вводили напрямую.
  2. Подоболочка $() вокруг $($CMD) кажется подозрительной,Вы не только выполняете команду, хранящуюся в $CMD, но также выполняете вывод этой команды!

1.Кавычки внутри переменных

Когда вы вводите команду echo "a b", bash обрабатывает эту команду так, что echo выполняется с аргументом a b.Вывод будет a b.

Когда вы сохраните эту команду внутри переменной и развернете ее, bash будет обрабатывать содержимое переменной по-другому.Команда echo будет выполнена с аргументами "a и b".Вывод будет "a b".

Это причина сообщения об ошибке

curl: (26) couldn't open file "/var/log/tyk/2018-October-18-10.csv""

curl пытается открытьпуть с фактической цитатой внутри.Такой путь не существует в вашей системе.

Чтобы обойти эту проблему, вы могли бы записать eval "$cmd", тогда команда будет выполнена так, как если бы вы вводили ее напрямую.Тем не менее, вы действительно не должны.Вместо этого я бы переписал сценарий, чтобы не сохранял команды в переменных.

2.Оболочка вокруг $cmd:

cmd='echo something'
$cmd

Это будет печатать something.Тем не менее, ваш сценарий не останавливается на достигнутом, потому что вы заключили $cmd в $().Поэтому вывод something также выполняется.

cmd='echo something'
$($cmd)

приводит к

bash: something: command not found
...