У меня есть функция, которая отбрасывает текущую среду и запускает скрипт как новый логин:
# 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
оставить пустые аргументы?