Похоже, что один из сценариев работает под /bin/sh
но использует расширенные функции удара, возможно <<<
или <(
. У Вас, по-видимому, есть пепел как /bin/sh
; это законно (и пепел в известной мере быстрее и использует меньше памяти, чем удар, который является, почему много дистрибутивов не помещают удар как /bin/sh
), но иногда Вы сталкиваетесь со сценариями, которые полагаются на удар, все же запускаются с #!/bin/sh
.
То, что Вы имеете $SHELL
набор для избиения не важен, каждый сценарий выполняется оболочкой, обозначенной на первой строке (хижина, здесь #!/bin/sh
). У меня был беглый взгляд на сценарии RVM, и он похож на все те, которые полагаются на расширения удара, правильно запускаются с #!/usr/bin/env bash
. У Вас есть предшествующее существующее ~/.rvm
? Если так, попытайтесь переместить его из пути.
Можно получить трассировку выполнения для сценария оболочки путем выполнения оболочки с -x
опция. Таким образом выполненный bash -x ./rvm
и посмотрите, где ошибка происходит. Если ошибка происходит в сценарии, названном косвенно от основного rvm
сценарий, попытка добавить set -x
в других сценариях также (сразу ниже #!
строка), для наблюдения трассировки выполнения для них. Это должно помочь определить местоположение незаконного сценария.
Включите null_glob
опция для Вашего шаблона с N
спецификатор шарика.
list_of_files=(*(N))
Если Вы делаете это на всех шаблонах в сценарии или функции, включаете null_glob
опция:
setopt null_glob
Этот ответ имеет удар и ksh эквиваленты.
Не использовать print
или замена команды! Это генерирует строку, состоящую из имен файлов с пробелами между ними вместо списка строк. (См. то, Что разделяет слово? Почему это важно в программировании оболочки?)
Я думаю, что Вы ищете NULL_GLOB
опция:
NULL_GLOB (-G) If a pattern for filename generation has no matches, delete the pattern from the argument list instead of reporting an error. Overrides NOMATCH.
Попробуйте этот путь:
list_of_files=$(print other*) 2>/dev/null
Это перенаправит вывод ошибок от stderr до/dev/null, и это не отобразится.
Лучший способ: для in * (. N); делать ... ; сделано
. Параметр N заставляет zsh доставлять пустой список в for, а for будет повторяться ноль раз.
Остерегайтесь ls * .foo (.N)
; когда ls получает пустой список аргументов, он перечисляет все файлы вместо ни одного. Вот почему мне не нравится NULL_GLOB (или его эквивалент в bash): он изменяет все глобусы и легко прерывает вызовы, например, ls.