我希望制作一个 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 脚本来同时打开我想要打开的每个文件?
首先,无需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)
它将在适当的工具中打开每个文件,并可以处理您想要提供的任意数量的文件。