Как записать в любой файл, кроме существующих обычных файлов, используя bash? - PullRequest
0 голосов
/ 17 марта 2019

Я сделал следующие попытки .. напрасно:

  1. hello.sh используя "test -f"
#! /bin/bash
test -f $1 && exit 1 || echo "hello" > $1

К сожалению, $ ./hello.sh /dev/stdout > non_existent не пишет.

  1. hello2.sh с использованием "set -C"
#! /bin/bash
set -C; echo "hello" > $1

Кроме того, $ ./hello2.sh /dev/stdout > non_existent по-прежнему не работает.

Я предполагаю, что при перенаправлении bash вызывает freopen("/dev/stdout", "w", $1), что ошибочно делает / dev / stdout похожим на существующий обычный файл.

Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Вы можете использовать exec . Попробуйте скрипт оболочки ниже

#!/bin/bash
exec 7<&1 # Make file descriptor 7 a copy of stdout
[ -f "$1" ] && echo "File ${1} exists" && exit 1
# At this point we can confirm the file doesn't exist
exec 1>"$1"
echo "Bingo" # This goes to the file
# Now revert the value of STDOUT using the copy we made
exec 1<&7
# For testing, the output should print at stdout
cat "$1"

Протестируйте скрипт с помощью

./script.sh outfile
0 голосов
/ 17 марта 2019

Да, просто закройте стандартные файловые дескрипторы во время (только) теста:

$ test -f /dev/stdout <&- >&- 2>&-
$ echo $?
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...