Командная строка процесса состоит из элементов параметра argv
системного вызова execve
. Этот параметр представляет собой массив, пронумерованный от 0, где элементы с номерами от 1 до n являются аргументами, передаваемыми при вызове команды, а элемент 0 выбирается оболочкой или другой программой, которая вызывает вызов execve
. Обычно элемент 0 - это строка, используемая для обозначения команды.
Линии Шебанга обрабатываются ядром. Ядро вставляет аргумент 0, который представляет собой путь, указанный после #!
магический префикс. Итак, если вы запустите /root/user/test.sh
с одним аргументом foo
из startproc
, то startproc
создаст ] вызов execve
с двумя аргументами 0 = /root/user/test.sh
, 1 = foo
. Когда /root/user/test.sh
начинается с / bin / bash
, ядро видит shebang в /root/user/test.sh
и перезаписывает список аргументов должен быть 0 = / bin / bash
, 1 = /root/user/test.sh
, 2 = foo
.
Если строка shebang имеет вид #! / Bin / env bash
, тогда ядро вставляет два элемента в список аргументов: программу и аргумент. (Linux здесь ограничен одним аргументом.) Таким образом, в этом случае вызов преобразуется в 0 = / bin / env
, 1 = bash
, 2 = / root /user/test.sh
, 3 = foo
.Программа env
выполняет свою работу и выдает новый системный вызов execve
с 0 = bash
(соблюдая соглашение о том, что аргумент 0 - это путь, используемый для обозначения команды ), 1 = /root/user/test.sh
, 2 = foo
.
Во всех случаях /root/user/test.sh
будет первым аргументом процесса.
Вы забыли добавить $
перед именем переменных, поэтому они не расширяются до правильных значений, которые вы установили.
попробуй
scp "$somepath/${file}.zip" "$ftp_user"@"$ftp_server":upload/