как это работает? for loop strips variable result

Были разговоры (еще в Linux 0.x-1.x дней) о добавлении этого (потому что это было полезно в системах BSD), но, если я правильно помню, были причины, по которым это было труднее сделать прямо в Linux, чем в BSD в то время.

Обратите внимание, что то, о чем вы спрашиваете, - это лишь небольшая часть функции (а именно, вы говорите о записи stty info для control-T, заставляющей ядро ​​доставить SIGINFO группе процессов tty ) - эта часть «проста» - но когда ядро ​​сообщает информацию о состоянии процесса, когда оно не обрабатывает сигнал ( потому что в то время очень немногие вещи поддерживали это, функция была в основном о том, «крутится ли этот процесс или зависает» и «что это за процесс в любом случае»). Сложнее - ISTR даже были проблемы с безопасностью / доверием при отображении этой информации точно, и должен ли он быть связан с путем Secure Attention Key. Тем не менее, может быть какая-то ценность в "легкой" версии, которая только посылает сигнал ...

(Из личной памяти; быстрый поиск в Интернете не дает ничего очевидного, но я думаю, что нужно копаться в действительно старые архивы, чтобы найти обсуждение.)

0
16.04.2019, 19:30
2 ответа

См. справочную страницу для wc -c.

Выводит bytecount filenameв $lineв виде списка, разделенного пробелами.

Цикл for $woord in $lineсчитывает первую переменную (до первого пробела )из $list, который является bytecountи сохраняет его в $res. Затем вместо чтения следующего элемента в $listвыполняется инструкция breakи выход из цикла.

Как говорит @ikkachu, есть более простые способы получить bytecount, чем с помощью цикла.

0
28.01.2020, 02:40

В for word in $line,содержимое переменной lineразбивается на слова и затем расширяется для имен файлов (см. также этивопросы). Затем цикл выполняется один раз для каждого результирующего значения (или «слова» ). В этом случае, однако, есть только одна итерация цикла, так как оператор breakостанавливает выполнение цикла. В результате значение res, установленное на этой первой итерации цикла, остается, и эффект такой же, как при выборе первого слова, разделенного пробелом -, из line.

Были бы лучшие способы написать это, мы могли бы, например,. удалите имя файла с расширениями оболочки. Это выведет23:

line='23 somefilename'
res="${line%% *}"
echo "$res"

Или просто пусть wcне выводит имя файла с самого начала, перенаправляя файл на стандартный ввод wcвместо передачи имени файла на wc. Сравните эти два:

$ wc -c foo.txt
8 foo.txt
$ wc -c < foo.txt
8
1
28.01.2020, 02:40

Теги

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