Выполнение сценария в zsh - полномочия файла

Извлечение строк 10 - 20 из файла является простой комбинацией head и tail:

tail -n +11 | head -n 10 | mycommand

Эта команда пропускает 10 строк и обрабатывает следующие 10. Если Вы хотите обработать все строки в файле в последовательности, но группами 10, существуют лучшие пути. Можно считать 10 строк с head неоднократно. Отметьте использование chunk=$(…; echo a) сопровождаемый путем снимания a, работать вокруг подавления заключительных новых строк в заменах команды. Этот подход имеет преимущество работы, даже если вход является каналом (который Вы не можете перемотать), и это быстрее для регулярного файла также. Предупреждение, непротестированный код, введенный непосредственно в браузере.

while chunk=$(head -n 10; echo a); chunk=${chunk#a}; [ -n "$chunk" ]; do
  printf %s "$chunk" | mycommand
done <filename

С другой стороны, можно заставить awk сделать задание. Снова, непротестированный.

awk '
    {chunk = chunk $0 RS}
    NR % 10 {print chunk | "mycommand"; close("mycommand"); chunk="" }
    END {if (chunk != "") {print chunk | "mycommand"; close("mycommand"); chunk="" }}
' <filename
16
31.08.2012, 04:49
1 ответ

Когда Вы работаете ./s, Вы говорите ядру выполнять программу s. Если у Вас есть разрешение выполнения, то ядро читает первые несколько байтов файла, видит #! строка, таким образом, это знает, что это - сценарий, и выполняет интерпретатор, передавая его название сценария как его первый аргумент. Если Вы не имеете, выполняют разрешение, ядро прерывает выполнение в первом шаге.

Когда Вы работаете zsh s, Вы выполняетесь zsh, и скажите этому читать названный файл s и интерпретируйте его как команды. Вы не выполняетесь s, Вы выполняетесь zsh. То же самое с sh s или cat s.

Когда Вы работаете source s, снова, Вы говорите zsh читать файл, поэтому что имеет значение, то, что Вы прочитали разрешение на нем.

17
27.01.2020, 19:48
  • 1
    Хорошо, это имеет смысл. Но это не полностью побеждает точку наличия выполнить разрешения? Не имеет значения, установлено ли это или нет, я буду всегда мочь выполнить сценарий (или сказать zsh интерпретировать команды в сценарии, который эквивалентен). –  C106 31.08.2012, 12:09
  • 2
    Кроме того, cat s просто печатает содержание файла. cat s | zsh передает их zsh и печать Test. –  C106 31.08.2012, 12:11
  • 3
    @C106 точка выполнить разрешения должна указать, что файл представляет что-то, что можно выполнить без дополнительной информации. Также важно, если файл является setuid/setgid. Файл не мог бы иметь разрешения выполнения, но тем не менее состоять из инструкций, что это происходит, который где-нибудь выполняет некоторая компьютерная программа. –  Gilles 'SO- stop being evil' 31.08.2012, 23:32
  • 4
    Это имеет большой смысл и на самом деле невероятно очевидно действительно.Спасибо. –  C106 01.09.2012, 03:07

Теги

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