Почему бы не использовать stat
вместо ls
?
stat -c "%y %s %n" *
Правильное объяснение было уже дано jsbillings и geekosaur, но позволило мне подробно остановиться на этом немного.
В большинстве оболочек, включая удар, каждая сторона конвейера работает в подоболочке, таким образом, любое изменение во внутреннем состоянии оболочки (таком как установка переменных) остается ограниченным тем сегментом конвейера. Единственная информация, которую можно получить от подоболочки, - то, что она производит (к стандартному выводу и другим дескрипторам файлов) и его код выхода (который является числом между 0 и 255). Например, следующий отрывок печатает 0:
a=0; a=1 | a=2; echo $a
В ksh (варианты, полученные на основании кода AT&T, не pdksh/mksh варианты) и zsh, последний объект в конвейере выполняется в родительской оболочке. (POSIX позволяет оба поведения.), Таким образом, отрывок выше печатает 2.
Полезная идиома должна включать продолжение цикла с условием продолжения (или независимо от того, что Вы имеете на правой стороне конвейера, но некоторое время цикл на самом деле распространен здесь) в конвейере:
cat junk | {
while read var ; do x=55 ; done
echo x=$x
}
Вы сталкиваетесь с переменной проблемой объема. Переменные определили в цикле с условием продолжения, который находится на правой стороне канала, имеют их собственный локальный контекст объема, и изменения в переменной не будут замечены за пределами цикла. Цикл с условием продолжения является по существу подоболочкой, которая получает КОПИЮ среды оболочки, и любые изменения в среде потеряны в конце оболочки. Посмотрите этот вопрос о StackOverflow.
ОБНОВЛЕННЫЙ: Я забыл указывать на важное то, что цикл с условием продолжения со своей собственной подоболочкой происходил из-за него являющийся конечной точкой канала, я обновил это в ответе.
while
цикл как заключительная часть конвейера, который бросает его в подоболочку.
– geekosaur
23.03.2011, 16:44
blah|blah|while read ...
, Вы можете иметь while read ...; done < <(blah|blah)
– glenn jackman
23.03.2011, 17:01
#!/bin/bash
set -x
# prepare test data.
mkdir -p ~/test_var_global
cd ~/test_var_global
echo "a"> core.1
echo "b"> core.2
echo "c"> core.3
var=0
coreFiles=$(find . -type f -name "core*")
while read -r file;
do
# perform computations on $i
((var++))
done <<EOF
$coreFiles
EOF
echo $var
Result:
...
+ echo 3
3
это может сработать.
< <(locate -ber ^\.tag$)
, благодаря исходному немного неясному ответу и geekosaur и comemnts glenn jackman.. Я первоначально находился в трудном положении о принятии ответа, но результат нетто был довольно ясен, особенно с :) – Peter.O 24.03.2011, 14:31