Как я могу вывести команду в файл, не получив пустой файл по ошибке?

Каким-то образом это Мне пришло в голову, что это могло быть вызвано недавно установленной мной утилитой unclutter . Оказывается, виноват в этом. Узнав об этом, я обнаружил, что о проблеме уже сообщалось, например здесь: https://askubuntu.com/questions/3022/weird-mouse-problem .

Кроме того, я нашел альтернативу под названием hhpc : https://github.com/Aktau/hhpc . Собираюсь попробовать.

6
17.12.2018, 16:41
3 ответа

Вы можете удалить файл после запуска, если команда не удалась, с помощью

myAPICommand parameters > myFile.txt || rm myFile.txt

Но я бы предложил вместо этого стереть файл:

myAPICommand parameters >| myFile.txt

См. Что такое операторы управления и перенаправления оболочки? для получения подробной информации.

11
27.01.2020, 20:20

У вас должен быть установлен "noclobber", проверьте следующий пример:

$ echo 1 > 1  # create file
$ cat 1
1
$ echo 2 > 1  # overwrite file
$ cat 1
2
$ set -o noclobber
$ echo 3 > 1  # file is now protected from accidental overwrite
bash: 1: cannot overwrite existing file
$ cat 1
2
$ echo 3 >| 1  # temporary allow overwrite
$ cat 1
3
$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ cat 1
3
$ set +o noclobber
$ echo 4 > 1
$ cat 1
4

"noclobber" предназначен только для перезаписи, но вы все равно можете добавить его:

$ echo 4 > 1
bash: 1: cannot overwrite existing file
$ echo 4 >> 1

Чтобы проверить, установлен ли у вас этот флаг, вы можете ввести echo $-и посмотреть, установлен ли у вас флаг C(илиset -o |grep clobber).

В :Как избежать записи пустого файла в случае сбоя базовой команды?

Есть требования? Вы можете просто сохранить вывод в переменной, а затем проверить, пуста ли она. Проверьте следующий пример (обратите внимание, что способ проверки переменной требует точной настройки в соответствии с вашими потребностями, в примере я не цитировал его и не использовал что-либо вроде ${cmd_output+x}, который проверяет, установлена ​​ли переменная, чтобы избежать записи файла содержащие только пробелы.

$ cmd_output=$(echo)
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e '\n\n\n')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e ' ')
$ test $cmd_output && echo yes || echo no
no
$ cmd_output=$(echo -e 'something')
$ test $cmd_output && echo yes || echo no
yes

$ cmd_output=$(myAPICommand.exe parameters)
$ test $cmd_output && echo "$cmd_output" > myFile.txt

Пример без использования одной переменной, содержащей весь вывод:

log() { while read data; do echo "$data" >> myFile.txt; done; }
myAPICommand.exe parameters |log
11
27.01.2020, 20:20

Можно создать сценарий для запуска myAPICommand.exe, но сначала удалить файл myFile.txt, если он существует. Тогда вам не придется постоянно выполнять команду rm для очистки.

Нравится:

if [ -e myFile.txt ]
then
    rm myFile.txt && myAPICommand.exe
else

Вы также можете сделать так, чтобы ваша команда убирала за собой. Если файл пуст, добавьте что-то вроде следующего.

Нравится:

if [ -s myFile.txt ]
then
        EXIT 0
else
        rm myFile.txt && EXIT 1
fi
3
27.01.2020, 20:20

Теги

Похожие вопросы