2015-11-24 8 views
0

У меня есть сценарий, который я в основном закончил, за исключением одной проблемы. Я просто не могу взломать удаление символа перевода строки до того, как он будет передан zbarimg. Я пробовал различные вещи, оглядываясь в Интернете, и, похоже, не может найти ничего, чтобы избавиться от этого надоедливого персонажа. Любая помощь будет принята с благодарностью.Bash - Удаление символа Linefeed из сценария

#!/bin/bash 
folder=~/Public 

cdate=$(date +"%Y-%m-%d-%H:%M") 

inotifywait -m -q -e create -r --format '%:e %w%f' $folder | while read file 

    do 
    ifile=$(ls -Art ~/Public | tail -n 1) 
    ifile2=$(echo $ifile | tr '\n' ' ') 
    echo $ifile2 >> /tmp/latest.txt 
    zbarimg $ifile2 | pluma 
    done 

Выход LS -alrt (последние несколько строк)

-rw-r--r-- 1 mintux mintux 875988 Nov 11 12:42 20151111_114942.jpg 
-rw-r--r-- 1 mintux mintux 801317 Nov 11 12:45 20151111_114759(2).jpg 
-rw-r--r-- 1 mintux mintux 875988 Nov 11 12:45 20151111_114942(2).jpg 
-rw-r--r-- 1 mintux mintux  911 Nov 23 23:24 nov23.png 
-rw-r--r-- 1 mintux mintux 23158 Nov 23 23:43 nov23a.png 
drwxr-xr-x 73 mintux mintux 24576 Nov 24 08:42 .. 
drwxr-xr-x 4 mintux mintux  4096 Nov 24 12:10 . 
+0

вы пробовали Http: // stackoverflow.com/questions/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file –

+1

Трудно понять, что вы пытаетесь чтобы выполнить без доступа к входу и желаемому выходу. Ваш вопрос будет значительно улучшен, если вы заберете части 'inotifywait' и' zbarimg' и просто сосредоточитесь на фактической модификации строки. Во всяком случае, 'echo $ ifile' без [правильного цитирования] (http://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-variable) уже по совпадению потеряет любую новую строку, но, вероятно, ошибочно из них. – tripleee

+0

Нет '' \ n''. Вы можете доказать это себе: ifile = $ (ls -Art ~/Public | tail -n 1); echo "'$ ifile'" 'Какую новую строку вы пытаетесь удалить с помощью строки' ifile2 = '? ** Примечание: ** в 'echo $ ifile2',' echo' автоматически добавляет новую строку, используйте 'echo -n $ ifile2 >>/tmp/latest.txt', если вы не хотите новой строки после' $ ifile2'. –

ответ

0

Вы вопрос немного неясно, но в сценарии ниже, нет newline ('\n') в конце либо ifile или ifile2. Хотя довольно сложно точно определить, что вы пытаетесь искоренить, newline, ваша цель состоит в том, чтобы предотвратить запись newline в /tmp/latest.txt после перенаправления $ifile2 на файл. (Это единственный возможный newline на выпуске) толькоnewline участвует в этой всей сделке является newline положить туда сам echo:

#!/bin/bash 

folder=~/Public 

cdate=$(date +"%Y-%m-%d-%H:%M") 

inotifywait -m -q -e create -r --format '%:e %w%f' $folder | while read file 

do 
    ifile=$(ls -Art ~/Public | tail -n 1) 
    ifile2=$(echo $ifile | tr '\n' ' ') 
    echo $ifile2 >> /tmp/latest.txt 
    zbarimg $ifile2 | pluma 
done 

Если вы не хотите, не newline написанного /tmp/latest.txt, а затем использовать echo -n или printf , например:

#!/bin/bash 

folder=~/Public 

cdate=$(date +"%Y-%m-%d-%H:%M") 

inotifywait -m -q -e create -r --format '%:e %w%f' "$folder" | while read -r file 

do 
    ifile=$(ls -Art ~/Public | tail -n 1) 
    echo -n "$ifile" >> /tmp/latest.txt # or printf "%s" "$ifile" 
    zbarimg "$ifile" | pluma 
done 

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

echo "'$ifile'" 

Примечание2: В Баш, если внутри [[...]] вы должны всегда цитировать переменные. (если вы не помните [[...]], то только всегда укажите ваши переменные). Кроме того, использование ls (любой порядок сортировки) для заполнения вашей переменной ifile восприимчиво к множеству тонких ошибок имени файла (символы новой строки в именах файлов и т. Д.) См. Bash Pitfalls (#1) по причинам, связанным с попыткой выполнить итерацию по возврату ls.


«когда я вручную запустить его вне сценария он открывает его только штрафом но выдает ошибку о невозможности открыть файл из с в это».

OK, что имеет смысл. Один из способов найти самый новый файл в "$folder" без pitfals присущего разбора ls будет:

#!/bin/bash 

folder=~/Public 

cdate=$(date +"%Y-%m-%d-%H:%M") 

inotifywait -m -q -e create -r --format '%:e %w%f' "$folder" | while read -r file 

unset -v ifile 
for fname in "$folder"/*; do 
    [[ $fname -nt $ifile ]] && ifile="$fname" 
done 

zbarimg "$ifile" | pluma 

Дайте что попробовать и дайте мне знать, если это излечивает вопрос.

+0

У меня в основном есть файл «latest.txt» для отладки, что я действительно пытаюсь сделать, это предотвратить использование нового символа линии с помощью утилиты zbarimg, он ведет себя так, как будто файл, который я передал, имеет новую строку как когда я вручную запускаю его за пределами скрипта, он открывает его просто отлично, но вызывает ошибку в том, что он не может открыть файл из него. – user1208273

+0

Здесь вы должны быть осторожны. Все файлы, в соответствии с определением POSIX файла, будут иметь «новую строку», заканчивающую содержимое. Это не означает, что все файлы будут соответствовать требованию конца строки POSIX (вы можете принудительно форматировать файл без новой строки в конце), но все поддерживаемые POSIX утилиты и т. Д. Ожидают, что он будет там. Я буду искать 'zbarimg' и посмотреть, смогу ли я найти что-нибудь, что поможет. Я до сих пор не слышал об этом. Позвольте мне посмотреть, что я могу найти. Ваш скрипт (кроме указанного) ничего не делает неправильно, ведь запись без новой строки не является POSIX сама по себе ':)' –

+0

@ user1208273 * ", когда я вручную запускаю ее за пределами скрипта, она открывает ее просто отлично, но бросает ошибка в том, что вы не можете открыть файл с помощью в нем "*. Хорошо, это настоящая ошибка. Вы видите комментарий «Bash Pitfalls» в последнем абзаце ответа. Я подозреваю, что это проблема. Какой файл вы хотите выбрать из '~/Public' (самый новый?). Дайте мне знать, и мы будем работать над альтернативой, которая НЕ включает использование 'ls' и' tail' для ее выбора. (кстати, сканирование штрих-кода 'zbarimg' не является проблемой, это то, как вы заполняете' ifile') –

0

Так что после всего этого получается реальная проблема: я только что забыл добавить папку в имя файла, поэтому причина, по которой zbarimg не могла открыть файл, не имела никакого отношения к фидам строк, как я думал, здесь в основном то, что установил его:

zbarimg $folder/$ifile2 

Еще раз спасибо всем, кто предложил помощь, извините за некомпетентность с моей стороны может благословение и прощение в Интернете на мне :)

 Смежные вопросы

  • Нет связанных вопросов^_^