Перенаправление ввода на for и while

Не уверен, связано ли это с текущим выпуском Джесси(https://lists.debian.org/debian-devel-announce/2019/03/msg00006.html)или нет. но для тех, кто получил ту же ошибку, даже уже используется

sudo apt-get -o Acquire::Check-Valid-Until=false update

и по-прежнему возникала та же проблема, можно попробовать вместо этого

echo 'Acquire::Check-Valid-Until no;' > /etc/apt/apt.conf.d/99no-check-valid-until

У меня работает:)

4
25.06.2020, 17:12
2 ответа

Таким образом написана грамматика POSIX . Команда определяется как:

command          : simple_command
                 | compound_command
                 | compound_command redirect_list
                 | function_definition

Где простая команда

simple_command   : cmd_prefix cmd_word cmd_suffix
                 [...]

, а также cmd_prefixи cmd_suffixв конечном итоге разрешают перенаправление. Для составных команд есть только redirect_listв конце, что разрешает их, ничего, что разрешало бы их впереди.

Это не совсем должно быть таким, например. Zsh прекрасно это принимает:

% > output for x in a b c ; do echo $x; done
% cat output 
a
b
c

Но Zsh несовместим, так как в стандартных оболочках ведущее перенаправление заставляет команду forанализироваться как обычная простая команда,это означает, что следующее допустимо , и оболочка попытается найти и запустить команду, буквально называемуюfor(с пятью аргументами и перенаправлением stdout ). Давая ошибку, которую вы видели:

$ > output for x in a b c
bash: for: command not found

(В частности, в Bash сначала анализируется вся входная строка, поэтому, если вы дадите Bash весь for-do-doneиз первого примера в одной строке, он просто выдаст синтаксическую ошибку для doи не t выполнить forперед этим.)

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

Однако следует отметить, что обсуждалось изменение стандарта в этом отношении. (Вероятно, никто -в здравом уме не полагается > output for...на команду с именем forвместо цикла оболочки ).

7
28.04.2021, 23:12

forи whileне являются командами, это зарезервированные слова, которые начинают заголовок цикла. Вы можете использовать перенаправление для всего цикла, но оно должно быть в конце.

Это не не работает:

<file for((i=0;i<3;i++)); do read line; echo "$line"; done

Это работает :

      for((i=0;i<3;i++)); do read line; echo "$line"; done <file
6
28.04.2021, 23:12

Теги

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