Я худею с вашего говнокода

Sep 26, 2019 12:58


Потерял почти целый рабочий день на одном странном затыке.

Задача. У нас есть обычный текстовый файл, в нем N строчек. Нужно запустить некоторое приложение также N раз, передав ему в качестве параметра очередную строчку из упомянутого файла. Казалось бы, что может быть проще?
#!/bin/bash ( Read more... )

ненависть, работа, it, bash, java

Leave a comment

cae32 September 26 2019, 10:49:19 UTC
Гм.
Before a command is executed, its input and output may be redirected using a special notation interpreted by the shell

То есть, если запускаемый хочет STDIN, он таки его получит не из /dev/null, а таки из того, кто был родителем на время старта.

Reply

klink0v September 26 2019, 11:20:34 UTC
Хрен знает. Но вот так, как в последнем примере - работает. По-другому - не работает. С другим софтом подобных проблем никогда не было.

Reply

cae32 September 26 2019, 11:37:08 UTC
Не воспринимайте стороннюю программу, как соответствующую unix-way.
Нормальный grep или там sed будет брать параметры из cli, и только если их нет. займётся STDIN.
Но это же для сторонних утилит, скажем мягко, не совсем так. О чём думал автор, обычно загадка.
Поэтому, да, если сам держишь в скрипте STDIN, приходится заботиться о том, чтобы не отдать его кому-нибудь ненароком после fork.
Я последнее время даже trap не ленюсь писать в shell :)

Reply

klink0v September 26 2019, 11:46:27 UTC
А можно пример кода с trap-ами?

Reply

cae32 September 26 2019, 12:03:06 UTC
Традиционный install-sh из кучи мест:

# Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0

Reply

cae32 September 26 2019, 12:06:04 UTC
Ну а из своего тестового окружения:

delete_temp_dir() {
if [ -d "${TMP_DIR}" ] ; then
rm -rf "${TMP_DIR}"/* && rmdir "${TMP_DIR}"
else
return 0
fi
}

....

trap delete_temp_dir 0 INT TERM QUIT

Reply

klink0v September 26 2019, 12:15:21 UTC
Дык это ж перехват системных сигналов. При чём здесь ввод-вывод?

Reply

cae32 September 26 2019, 12:52:57 UTC
Это просто собственный пример, когда на shell смотрится полностью как на ЯП, а не только для текущих задач администрирования.

Reply

klink0v September 26 2019, 12:58:49 UTC
Это всё, конечно, замечательно. Но как мне предлагается насильно захватить этот самый STDIN и никому его не отдавать, даже если они будут очень сильно хотеть его забрать себе?

Reply

cae32 September 26 2019, 13:15:15 UTC
0

Reply


Leave a comment

Up