псевдоним, использующий `$1 `и резервное значение по умолчанию, печатает как параметр, так и резервное значение

Когда вы используете менеджер пакетов, вам не нужно сначала загружать, а затем устанавливать. Вы должны просто бежать:

sudo dnf install inkscape

Предположим, вы уже загрузили несколько пакетов локально и хотите их установить, тогда вы можете:

sudo dnf install /path/to/package.rpm

Если у вас есть каталог, полный пакетов, которые можно использовать для установки, вам следует преобразовать этот каталог в репозиторий (с помощьюcreaterepo)и добавить его в dnfв качестве репозитория...

1
03.11.2020, 10:13
2 ответа

псевдонимы — это просто замена текста перед очередным раундом интерпретации синтаксиса оболочки, они не принимают аргументы, поэтому после:

foo 69

Текст fooзаменяется на NUM=${1:-42}; echo $NUM, а затем оболочка интерпретирует полученный текст:

NUM=${1:-42}; echo $NUM 69

$1все еще не установлено, так чтоNUM=42; echo 42 69

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

foo() {
  NUM=${1-42}
  printf '%s\n' "$NUM"
}

Здесь используется ${1-42}вместо ${1:-42}, как если бы пользователь вызывал foo '', я бы предположил, что он хочет, чтобы $NUMбыла назначена пустая строка.

5
18.03.2021, 22:53

How can I debug this kind of problem myself?

Один из стандартных шагов расследования — заглянуть под капот. и посмотреть, что происходит:

$ alias foo='NUM=${1:-42}; echo $NUM'
$ foo 69
42 69
$ echo "$NUM"
42

Несмотря на то, что вы определили псевдоним для эха $NUM, вы должны сделать это самостоятельно, вручную. Выше показано, что для NUMустанавливается значение 42. Это может дать вам подсказку, что аргумент "69" для псевдонима fooне взаимодействует с заданием NUM=; (очевидное? )вывод состоит в том, что это влияет только на  echo.


Небольшой общий совет: избегайте echoв пользу printf.

  1. echoможет делать относительно неожиданные вещи, если первый аргумент начинается с дефиса (‘-’ ), даже если оно происходит от переменной :
    $ NUM="In a perfect world..."
    $ echo $NUM; echo ABC
    In a perfect world...
    ABC
    $ NUM="-n a perfect world..."
    $ echo $NUM; echo ABC
    a perfect world...ABC
    
    Также, конечно, вы должны заключать переменные в кавычки.
  2. echoможет делать странные вещи, если аргумент (s )содержит обратную косую черту (es ).
    printfтакже обрабатывает обратную косую черту, но…
  3. … поведение printfстандартизировано, но существует около 42 различных версий echo.
  4. Наиболее важным для этого упражнения является то, echoне освещает границы между аргументами. echo Super Userи echo "Super User"дают одинаковый результат.

Так что попробуй:

$ alias foop='NUM=${1:-42}; printf "[%s]\n" $NUM'
$ foop
[42]
$ foop 69
[42]
[69]
$ foop The quick brown fox
[42]
[The]
[quick]
[brown]
[fox]

Это должно прояснить что ваш аргумент (s )применяется к концу псевдонима, и не запутаться в задании. Кроме того, код псевдонима не просто смотрит на первый аргумент.


Теперь, когда вы понимаете, что не контролируете псевдоним $1, вы можете задаться вопросом, откуда берется значение для NUM. Я не знаю, разумно ли ожидать, что вы подумаете об этом прежде чем вы полностью диагностируете проблему, но

$ set Once upon a midnight dreary
$ foo
Once
$ echo "$NUM"
Once

следует пояснить тот факт, что $1в определении псевдонима просматривает существующий список аргументов оболочки, а не аргументы, которые передаются при вызове псевдонима.

4
18.03.2021, 22:53

Теги

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