Bash - 输出到没有断行的文件

问题描述 投票:-1回答:1

我有一个简单的文件,执行时,它将采用文件名,通过exiftool运行,并将该输出生成到file.txt。

我唯一的问题是,当我打印exiftool输出时,我得到了良好的格式,每个元素在单独的行上。当我稍后将它管道传输到一个文件时,它显示没有新行,因此所有文本都在一行上。

怎么解决这个问题?

这是代码:

read -p 'File name: ' fileName
result=$(exiftool ./Files/$fileName)
printf "File Meta-data: \n $result\n\n"
echo  $result >> ./report1.txt

第三行打印以下内容,这是我的目的有效格式:

ExifTool Version Number         : 10.10
File Name                       : names.txt
Directory                       : ./Files
File Size                       : 46 bytes
File Modification Date/Time     : 2018:03:01 19:45:32-08:00
File Access Date/Time           : 2018:03:01 19:47:42-08:00
File Inode Change Date/Time     : 2018:03:01 19:45:32-08:00
File Permissions                : rw-rw-r--
Error                           : Unknown file type

但是当我检查report1.txt时,我看到以下格式:

ExifTool Version Number : 10.10 File Name : names.txt Directory : ./Files File Size : 46 bytes File Modification Date/Time : 2018:03:01 19:45:32-08:00 File Access Date/Time : 2018:03:01 19:47:42-08:00 File Inode Change Date/Time : 2018:03:01 19:45:32-08:00 File Permissions : rw-rw-r-- Error : Unknown file type
bash shell
1个回答
0
投票

Problem

问题是echo $result >> ./report1.txt中的未引用变量。

当你有一个不带引号的变量时,在执行echo之前,bash本身将使用所有空格(包括换行符)。

假设你有变量var="My String"。要有效地执行echo "My String"命令,你必须编写echo "$var"。当你调用echo $var(没有引号)时,bash将执行echo "My" "String"。 在这个例子中没有区别,因为echo用空格加入它的参数(MyString)。但是,如果您的变量包含制表符或换行符,则它们将替换为空格。

Solution

read -p 'File name: ' fileName
result="$(exiftool "./Files/$fileName")"
printf 'File Meta-data:\n%s\n\n' "$result"
echo "$result" >> ./report1.txt

Alternative solution

tee的帮助下,您不需要$result变量。 tee同时将其stdin重定向到文件和stdout。 tee -a附加到文件而不是覆盖文件。

read -p 'File name: ' fileName
echo 'File Meta-data:'
exiftool "./Files/$fileName" | tee -a ./report1.txt
© www.soinside.com 2019 - 2024. All rights reserved.