Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-从脚本中删除换行符_Bash_Zbar_Linefeed - Fatal编程技术网

Bash-从脚本中删除换行符

Bash-从脚本中删除换行符,bash,zbar,linefeed,Bash,Zbar,Linefeed,我有一个脚本,我基本上已经完成了,除了一个问题,我似乎无法在一个换行符传递给zbarimg之前删除它。我试过各种各样的东西,在网上到处看看,似乎找不到任何东西来摆脱这个讨厌的角色。任何帮助都将不胜感激 #!/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

我有一个脚本,我基本上已经完成了,除了一个问题,我似乎无法在一个换行符传递给zbarimg之前删除它。我试过各种各样的东西,在网上到处看看,似乎找不到任何东西来摆脱这个讨厌的角色。任何帮助都将不胜感激

#!/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的输出(最后几行)


您的问题有点不清楚,但在下面的脚本中,
ifile
ifile2
的末尾没有
换行符(
'\n'
)。虽然很难确定您试图消除的是什么
新行
,但您的目标似乎是在将
$ifile2
重定向到该文件后,防止
新行
写入
/tmp/latest.txt
。(这是唯一可以想象的有争议的
新行
)整个交易中唯一涉及的
新行
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
如果您不想在
/tmp/latest.txt
中写入任何
newline
,请使用
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:在bash中,除非在
[…]]
中,否则应始终引用变量。(如果您不记得
[[…]]
,请始终引用您的变量)。此外,使用
ls
(任何排序顺序)填充变量
ifile
容易出现一些细微的文件名错误(文件名中的换行符等)。有关尝试迭代返回
ls
的相关原因,请参阅


“当我在脚本之外手动运行它时,它会很好地打开它 但在中引发无法从打开文件的错误 它”

好吧,这更有意义。在
“$folder”
中查找最新文件的一种方法是,不使用解析
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

请尝试一下,让我知道这是否解决了问题。

因此,在所有这些之后,事实证明真正的问题是我刚刚忘记将文件夹附加到文件名,因此zbarimg无法打开文件的原因与换行无关,就像我认为这里基本上解决了它:

zbarimg $folder/$ifile2

再次感谢所有提供帮助的人,对我的无能表示歉意愿互联网的祝福和宽恕降临到我身上:)

你有没有尝试过如果没有输入和所需的输出,很难弄清楚你想要完成什么。如果您去掉
inotifywait
zbarimg
部分,只关注实际的字符串修改,您的问题会得到很大的改进。无论如何,
echo$ifile
withwithout将同时丢失任何换行符,但可能是错误的换行符。没有
'\n'
。你可以向自己证明它
ifile=$(ls-Art~/Public | tail-n1);echo“$ifile”
您想用
ifile2=
行删除什么新行?注意:在
echo$ifile2
中,
echo
自动添加换行符,使用
echo-n$ifile2>/tmp/latest.txt
如果你想在
$ifile2
之后没有换行符,我主要在那里有'latest.txt'文件进行调试,我真正想做的是防止在zbarimg实用程序中使用换行符,它的行为就像我传递给它的文件有一个新行字符一样,当我在脚本外部手动运行它时,它会很好地打开它,但会抛出一个错误,即无法从中打开文件。在这里,您必须小心。根据POSIX对文件的定义,所有文件都将有一个终止内容的
换行符。这并不意味着所有文件都将满足POSIX行结束要求(您可以强制一个文件在结束时没有换行符),但所有符合POSIX的实用程序等都会期望有一个。我将搜索
zbarimg
,看看是否能找到任何有用的东西。直到现在我才听说过。让我看看能找到什么。您的脚本(指定的脚本除外)没有做任何错误的事情,事实上,没有换行符的写入本身不是POSIX
:)
@user1208273“当我在脚本之外手动运行它时,它会很好地打开它,但会抛出一个错误,即无法从中打开文件”。好吧,这才是真正的问题所在。您可以在答案的最后一段看到
Bash陷阱
注释。我怀疑这就是问题的根源。您想从
~/Public
中选择哪个文件(最新的?)。让我知道,我们将制定替代方案,不包括使用
ls
tail
选择它。(顺便说一句,条形码扫描不是问题所在,这是您填写
ifile
的方式)是的,更正我的目的是运行该目录中的最新文件。好的,请查看答案末尾的添加内容,作为查找最新文件的替代方法。
zbarimg $folder/$ifile2