Как вернуть массив из функции с помощью Fish Shell

Я пытаюсь вернуть массив из функции. Код ниже не работает.

function testArray
   echo 1 2 3 4
end

set r (testArray)

echo $r[2]
# error

Каков правильный способ возврата нескольких значений из функции с помощью оболочки рыбы?

Ответ 1

Как объясняется ridiculous_fish, вы можете использовать собственный механизм разделения строк.

результат подстановки команды становится списком путем разбиения на строки новой строки ($IFS)

Итак,

  • укажите один элемент в строке;
  • затем запечатлеть это в подстановке команд.

Список

function __list_public_keys
    for key in ~/.ssh/*.pub
        echo $key
    end
end
вывод
$ __list_public_keys
/home/ed8/.ssh/id_rsa.blabla.pub
/home/ed8/.ssh/id_rsa.pub
/home/ed8/.ssh/id_rsa.test.pub

Захват

function __add_keys
    set keys (__list_public_keys)

    echo "[" $keys "]"
end
вывод
$ __add_keys
[/home/ed8/.ssh/id_rsa.blabla.pub] [/home/ed8/.ssh/id_rsa.pub] [/home/ed8/.ssh/id_rsa.test.pub]

Ответ 2

Результат подстановки команд становится списком путем разделения на строки новой строки (технически содержимое $IFS, но изменение IFS не рекомендуется).

Таким образом, вы можете заменить пробелы новыми символами, возможно, с помощью tr:

function testArray
   echo 1 2 3 4
end
set r (testArray | tr ' ' \n)
echo $r[2]

Или измените функцию, чтобы сразу выводить строки новой строки:

function testArray
   echo \n1\n2\n3\n4
end
set r (testArray)
echo $r[2]

https://github.com/fish-shell/fish-shell/issues/445 отслеживает лучшие механизмы генерации списков.

Ответ 3

Я не думаю, что это возможно. Сравните этот issue с GitHub.