Bash: передать аргумент "$ @" с пустыми переменными в sudo -i - PullRequest
2 голосов
/ 20 ноября 2019

У меня есть функция, которая отбрасывает текущую среду и запускает скрипт как новый логин:

# Recieves a username, a script path and the arguments of the script
run_in_new_login() {
    local user
    local script

    user=$1
    script=$2

    shift 2

    sudo -i -u "${user}" -H bash "${script}" "$@"  # LOST
}

Проблема с этой функцией в том, что если она получает пустые аргументы, этот аргумент отбрасывается. Пример:

#! /usr/bin/env bash
# ~/print_n_args.sh

echo "Recieved $# arguments"
param3=hello
param4="last_one_detected"
param5=""
param6=""

run_in_new_login ${USER} print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 4 arguments

Эти параметры теряются в строке LOST, потому что если я напечатаю количество аргументов до и после сдвига, количество сообщаемых аргументов будет 8 и 6 соответственно.

Есть ли способ передать их как пустые аргументы? (так же, как сама функция может их получать).


PS: я полностью осознаю, что в данном случае, в частности, я мог бы просто использовать sudo вместо своей функции, и все будет готово. с этим. Но меня интересует общий случай, когда скрипт -> функция -> передача аргумента скрипта, когда есть пустые аргументы. Неважно, использование sudo без функции имеет ту же проблему.


EDIT

Проводя дополнительное тестирование, я обнаружил, что на самом деле это проблема sudo:

sudo -u ${USER} -i -H bash print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 4 parameters

bash print_n_args.sh param1 param2 "${param3}" "${param4}" "${param5}" "${param6}"
> Recieved 6 parameters

Проблема с моей функцией заключается в том, что sudo удаляет пустые переменные. Есть ли способ сказать sudo оставить пустые аргументы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...