Как я могу использовать цикл в команде?

[12243] процесс реального времени [1128810] в случае жесткого реального времени, то есть процессы, которые никогда не истекают. Поэтому очевидно, что они не могут существовать в просроченной очереди. Однако, ядро 2.4 не гарантирует возможности работы в реальном времени, поэтому вам понадобится исправленное ядро. Для мягкого реального времени это возможно.[1128316]
1
02.03.2014, 22:41
1 ответ

In:

dirs="
  $HOME/Documents
  $HOME/Music
"

Вы присваиваете строку (содержащую пробелы, символы новой строки и любые символы, которые может содержать $HOME) скалярной переменной ($dirs).

Затем вы хотите передать список каталогов в ls, то есть несколько аргументов. Поэтому вам нужно как-то разделить эту строку на список аргументов для передачи в ls. Как вы собираетесь разделить ее? На пробелы и новые строки? Что если $HOME содержит пробелы или новые строки?

В оболочках POSIX есть оператор разбиения, точнее, оператор split+glob, который вы вызываете, оставляя переменную без кавычек. К счастью, по умолчанию разделение выполняется по пробелу и новой строке (и табуляции). Так что вы можете сделать:

IFS=' ''
' # space and newline
set -f # disable globbing as we want only the
       # splitting part of the split+glob operator
ls -- $dirs

Но здесь, поскольку нам нужен список, лучше всего хранить элементы в переменной типа списка, а не объединять их в строку, чтобы потом разделить ее.

В оболочках POSIX есть массив позиционных параметров ($1, $2... ) для этого:

#! /bin/sh -
set -- ~/Documents ~/Music
ls -- "$@"

Или, если вы не против сделать ваш скрипт медленнее и менее переносимым, используйте оболочку с переменными массива, например bash:

#! /bin/bash -
files=(
  ~/Documents
  ~/Music
)
ls -- "${files[@]}"

Или zsh:

#! /bin/zsh -
files=(
  ~/Documents
  ~/Music
)
ls -- $files
4
27.01.2020, 23:21

Теги

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