У меня есть сценарий Python, EulerianCycle.py
, и входной файл, euleriancycle.txt.
Я могу получить правильные результаты, выполнив py EulerianCycle euleriancycle.txt > cat euleriancycleout.txt
в текущей папке (py
- это псевдоним для python3
).
Однако в текущей папке у меня есть еще одна папка под названием outputs, в которую я хочу направить все мои выходные файлы.
Я пробовал py EulerianCycle.py euleriancycle.txt | cd outputs/ | cat > euleriancycleout.txt
И py EulerianCycle.py euleriancycle.txt | cat >cd outputs/euleriancycleout.txt
что дает мне ошибку broken pipe.
Если py EulerianCycle.py euleriancycle.txt
записывает в стандартный поток вывода (что, я полагаю, так и есть, поскольку в противном случае вы не смогли бы передать его по конвейеру cat
), тогда cat
здесь совершенно излишни - вы можете перенаправить стандартный вывод напрямую, указав абсолютный или относительный путь к вашему выходному файлу:
py EulerianCycle.py euleriancycle.txt > outputs/euleriancycleout.txt
(примечание: каталог output /
уже должен существовать).
Ни одна из других ваших команд не работает так, как вы могли представить.
в py EulerianCycle euleriancycle.txt> cat euleriancycleout.txt
, оболочка создает файл с именем cat
в текущем каталоге и перенаправляет вывод py EulerianCycle
, передав ему и euleriancycle.txt
, и euleriancycleout.txt
в качестве входных аргументов.
в py EulerianCycle.py euleriancycle.txt | cat> cd output / euleriancycleout.txt
, оболочка создает файл с именем cd
в текущем каталоге, cat
читает output / euleriancycleout.txt
и записывает его в файл cd
, игнорируя стандартный ввод из канала ( cat
читает только стандартный ввод, когда ему не заданы входные файлы, или явное -
).
Возможно, то, к чему вы здесь стремились, было направить вывод в подоболочку , например:
py EulerianCycle.py euleriancycle.txt | (cd outputs; cat > euleriancycleout.txt)
или
py EulerianCycle.py euleriancycle.txt | (cd outputs && cat > euleriancycleout.txt)
Здесь cat
читает стандартный ввод подоболочки, то есть предоставленный каналом - после перехода в целевой каталог. Вторая версия создает только euleriancycleout.txt
, если команда cd
завершилась успешно; первый создает его в текущем каталоге в случае сбоя cd
.
Кроме того, вы можете использовать:
EulerianCycle.py | tee euleriancycleout.txt
для одновременной отправки содержимого в текстовый файл и на стандартный вывод. в 2-х отдельных потоках. Другими словами, содержимое попадет как в текстовый файл, так и на печать в терминале.
Я всегда делаю это таким образом, поскольку он показывает мне, что написал, и избавляет меня от необходимости открывать vim для проверки моей работы.
Выяснилось, что могу использовать py EulerianCycle.py euleriancycle.txt | кошка> euleriancycleout.txt | mv -t output / euleriancycleout.txt
ИЛИ
py EulerianCycle.py euleriancycle.txt | cat> euleriancycleout.txt & mv -t output / euleriancycleout.txt
Все еще открыт для возможной команды, которая сделает это более кратко. :)
редактировать: представленный код неэффективен, см. Зеленую галочку, отмеченную ответом