使用shell脚本同时打开多个文件

Ree*_*ill 3 bash scripts

我希望制作一个 shell 脚本,使我能够打开在某个任务中使用的所有文件。在这种情况下,对本科作业进行评分。第二个文件位于第一个文件上方的目录中。

以下只打开了第一个文件:

#! /bin/bash
cd '/home/me/Dropbox/00-School/03-TA POLI 397/Assignment'
libreoffice grading-instructions.odt
cd ../
evince 'POLI 397 Assignment.pdf'
Run Code Online (Sandbox Code Playgroud)

我如何编写一个 shell 脚本来同时打开我想要打开的每个文件?

ter*_*don 6

首先,无需cd进入目录即可打开其中的文件。您可以只使用文件的完整(或相对)路径。所以,而不是cd foo然后libreoffice bar.doc,你可以做libreoffice foo/bar.doc

现在,下一个问题是打开多个文件。当您运行脚本时,该脚本中的每个命令都将按顺序执行,脚本将等待第一个命令完成,然后再启动第二个命令。这就是为什么您的脚本只打开一个文件,它一直等到第一个libreoffice进程退出才能继续调用evince.

如果您只需要打开两个文件,您只需要:

#!/bin/bash
libreoffice '/home/me/Dropbox/00-School/03-TA POLI 397/Assignment'/grading-instructions.odt & 
evince '/home/me/Dropbox/00-School/03-TA POLI 397/POLI 397 Assignment.pdf '
Run Code Online (Sandbox Code Playgroud)

您甚至不需要为此编写脚本。您可以将其直接粘贴到终端中:

libreoffice '/home/me/Dropbox/00-School/03-TA POLI 397/Assignment'/grading-instructions.odt & 
evince '/home/me/Dropbox/00-School/03-TA POLI 397/POLI 397 Assignment.pdf'
Run Code Online (Sandbox Code Playgroud)

诀窍是使用&after 第一个命令将其发送到后台并允许 shell 移动到下一个命令。

您可以通过使用xdg-openwhich 将找到处理每个文件的默认程序进一步简化xdg-open,您甚至不需要将第一个发送到后台,因为xdg-open它将在启动用于相关文件类型的任何程序后立即返回:

libreoffice '/home/me/Dropbox/00-School/03-TA POLI 397/Assignment'/grading-instructions.odt & 
evince '/home/me/Dropbox/00-School/03-TA POLI 397/POLI 397 Assignment.pdf'
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,您可以编写一个通用脚本,将 N 个文件名列表作为输入并打开每个文件名:

#!/bin/bash
xdg-open '/home/me/Dropbox/00-School/03-TA POLI 397/Assignment'/grading-instructions.odt 
xdg-open '/home/me/Dropbox/00-School/03-TA POLI 397/POLI 397 Assignment.pdf'
Run Code Online (Sandbox Code Playgroud)

如果您将其另存为~/bin/openFiles.sh并使其可执行 ( chmod a+x ~/bin/openFiles.sh),您现在可以运行:

openFiles.sh '/home/me/Dropbox/00-School/03-TA POLI 397/Assignment'/grading-instructions.odt' 
'/home/me/Dropbox/00-School/03-TA POLI 397/POLI 397 Assignment.pdf'
Run Code Online (Sandbox Code Playgroud)

它将在适当的工具中打开每个文件,并可以处理您想要提供的任意数量的文件。