Как тихо получить пустую строку от шаблона шарика без соответствий

Похоже, что один из сценариев работает под /bin/sh но использует расширенные функции удара, возможно <<< или <(. У Вас, по-видимому, есть пепел как /bin/sh; это законно (и пепел в известной мере быстрее и использует меньше памяти, чем удар, который является, почему много дистрибутивов не помещают удар как /bin/sh), но иногда Вы сталкиваетесь со сценариями, которые полагаются на удар, все же запускаются с #!/bin/sh.

То, что Вы имеете $SHELL набор для избиения не важен, каждый сценарий выполняется оболочкой, обозначенной на первой строке (хижина, здесь #!/bin/sh). У меня был беглый взгляд на сценарии RVM, и он похож на все те, которые полагаются на расширения удара, правильно запускаются с #!/usr/bin/env bash. У Вас есть предшествующее существующее ~/.rvm? Если так, попытайтесь переместить его из пути.

Можно получить трассировку выполнения для сценария оболочки путем выполнения оболочки с -x опция. Таким образом выполненный bash -x ./rvm и посмотрите, где ошибка происходит. Если ошибка происходит в сценарии, названном косвенно от основного rvm сценарий, попытка добавить set -x в других сценариях также (сразу ниже #! строка), для наблюдения трассировки выполнения для них. Это должно помочь определить местоположение незаконного сценария.

23
15.11.2016, 05:35
4 ответа

Включите null_glob опция для Вашего шаблона с N спецификатор шарика.

list_of_files=(*(N))

Если Вы делаете это на всех шаблонах в сценарии или функции, включаете null_glob опция:

setopt null_glob

Этот ответ имеет удар и ksh эквиваленты.

Не использовать print или замена команды! Это генерирует строку, состоящую из имен файлов с пробелами между ними вместо списка строк. (См. то, Что разделяет слово? Почему это важно в программировании оболочки?)

33
27.01.2020, 19:41

Я думаю, что Вы ищете 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.
4
27.01.2020, 19:41

Попробуйте этот путь:

list_of_files=$(print other*) 2>/dev/null

Это перенаправит вывод ошибок от stderr до/dev/null, и это не отобразится.

-1
27.01.2020, 19:41
  • 1
    Это не работает вообще. –  Pablo Olmos de Aguilera C. 10.09.2013, 17:55

Лучший способ: для in * (. N); делать ... ; сделано . Параметр N заставляет zsh доставлять пустой список в for, а for будет повторяться ноль раз.

Остерегайтесь ls * .foo (.N) ; когда ls получает пустой список аргументов, он перечисляет все файлы вместо ни одного. Вот почему мне не нравится NULL_GLOB (или его эквивалент в bash): он изменяет все глобусы и легко прерывает вызовы, например, ls.

15
27.01.2020, 19:41

Теги

Похожие вопросы