#bash #pipe #stdout #io-redirection
#bash #канал #стандартный вывод #io-перенаправление
Вопрос:
Из того, что я прочитал, bash должен обрезать файлы при их открытии. Однако после того, как я запускаю команду echo hello > file1 | ls > file1 > file2
, иногда file1 содержит «hello», иногда он ничего не содержит. Это действительно странное поведение, и я даже не могу выяснить, что это за шаблон, он кажется алеаторным. Вот, например, результат нескольких попыток в моем bash, иногда удаляя первый выходной файл раньше, иногда нет:
bash-3.2$ echo hello > output2 | ls > output2 > output3
bash-3.2$ cat output2
hello
bash-3.2$ rm output2
bash-3.2$ echo hello > output2 | ls > output2 > output3
bash-3.2$ cat output2
bash-3.2$ echo hello > output2 | ls > output2 > output3
bash-3.2$ cat output2
hello
bash-3.2$ rm output2
bash-3.2$ echo hello > output2 | ls > output2 > output3
bash-3.2$ cat ouput2
cat: ouput2: No such file or directory
bash-3.2$ cat output2
bash-3.2$ echo hello > output2 | ls > output2 > output3
bash-3.2$ cat output2
hello
Мне нужно воспроизвести поведение bash на C, поэтому мне действительно нужно посмотреть, что здесь за шаблон, почему файлы иногда усекаются, а иногда нет
РЕДАКТИРОВАТЬ: я знаю, что эта команда сама по себе не имеет смысла, мне просто нужно воспроизвести поведение bash в C с помощью любой команды, даже самой глупой, поэтому мне нужно знать, как это работает здесь. Я просто ввел простую для понимания команду без контекста, чтобы проиллюстрировать мою проблему
Комментарии:
1.Используйте
>
или|
для перенаправления стандартного вывода.2. То, что вы делаете, не имеет смысла. Сначала вы выполняете перенаправление после перенаправления в файл, что неразумно и не имеет никакого эффекта. Во-вторых,
ls
по умолчанию игнорирует его стандартный ввод, он может принимать только аргументы (например, с помощью xargs)3. @Cyrus Я знаю, что эта команда сама по себе не имеет смысла, мне просто нужно воспроизвести поведение bash на C с помощью любой команды, поэтому мне нужно знать, как это работает здесь. Я просто ввел простую для понимания команду без контекста, чтобы проиллюстрировать мою проблему
4. @thanasisp Я знаю, см. мое редактирование, я просто замечаю, что иногда выходные файлы не усекаются, что меня беспокоит, потому что все, кажется, говорят, что выходные файлы всегда усекаются при открытии
5. Когда вы запускаете конвейер, подобный
... | ...
правой и левой сторонам, Параллельно ; иногда левый заканчивается еще до запуска правого, иногда они запускаются практически одновременно на отдельных процессорных ядрах и т. Д. Попытка рассуждать о том, какой из них должен иметь свои побочные эффекты в первую очередь, является пустой тратой времени.