为什么我不能访问从“ ls”输出中收到的文件?

时间:2019-06-06 16:54:00

标签: bash variables

我正在尝试搜索放置在目录中的最新文件,并且我想读取文件的第一行以用作命令中的变量。当我使用下面的变量定义以及随附的代码行调用Chromium时,会收到一个错误消息,即未找到文件或目录,但是我们看到已找到文件或目录,并且如果我在{的定义之间放置了echo $FILE {1}}和FILE,它返回文件名。在错误消息中,您可以看到此信息。

我已经尝试了多种解决方案,但是除了这个错误,我什么也没得到。抱歉,如果我在这里没有全部定义。

LINE

我收到的错误是:

FILE=$(ls -t /media/presentation/Lobby2/ | head -n1)
LINE=$(head -n1 $FILE)
/usr/bin/chromium-browser --noerrdialogs --disable-infobars --kiosk $FILE &

2 个答案:

答案 0 :(得分:2)

除非您碰巧在/media/presentation/Lobby2中,否则head找不到文件,因为FILE仅包含onlinepresentation.txt –路径未列出。快速解决方案是将路径分开保存:

path=/media/presentation/Lobby2
file=$(ls -t "$path" | head -n1)
line=$(head -n1 "$path/$file")

(请注意引号和lowercase variable names一致。)

但是,不建议在脚本中使用ls的输出,请参见Why you shouldn't parse the output of ls(1)。在BashFAQ/003中讨论了获取最新文件的方法,

for file in /media/presentation/Lobby2/*; do
    [[ $file -nt $latest ]] && latest=$file
done
line=$(head -n1 "$latest")

您甚至可以取消所有非Bash命令,并用以下命令替换line=$(head -n1 "$latest")

IFS= read -r line < "$latest"

答案 1 :(得分:0)

Benjamin W.提供了一个很好的工作答案。

我最终选择了:

for file in $PATH1/*.mp4; do
    [[ $file -nt $latest ]] && latest=$file
done

if [ "$latest" -nt "$PATH2/video.mp4" ]
then
    cp $latest $destination
fi

谢谢