Не уверен, связано ли это с текущим выпуском Джесси(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
У меня работает:)
Таким образом написана грамматика 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
вместо цикла оболочки ).
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