我希望编写一个 shell 脚本,使我能够打开在执行某项任务时使用的所有文件。在本例中,我指的是给本科生作业评分。第二个文件位于第一个文件的上方目录中。
以下仅打开第一个文件:
#! /bin/bash
cd '/home/me/Dropbox/00-School/03-TA POLI 397/Assignment'
libreoffice grading-instructions.odt
cd ../
evince 'POLI 397 Assignment.pdf'
我怎样才能编写一个 shell 脚本来同时打开我想要打开的每个文件?
答案1
首先,无需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 '
您甚至不需要脚本。您可以直接将其粘贴到终端中:
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'
诀窍是&
在第一个命令之后使用将其发送到后台并允许 shell 移动到下一个命令。
您可以使用来进一步简化,xdg-open
它将找到处理每个文件的默认程序,并且使用xdg-open
,您甚至不需要将第一个发送到后台,因为xdg-open
它会在启动用于相关文件类型的任何程序时立即返回:
#!/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'
考虑到这一点,您可以编写一个通用脚本,以 N 个文件名列表作为输入并打开每个文件名:
#!/bin/bash
## Iterate over all file names given on the command line
for file in "$@"; do
## open each file
xdg-open "$file"
done
如果您将其保存为~/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'
它将使用适当的工具打开每个文件,并处理您想要的任意数量的文件。
答案2
经过一番摸索,我找到了自己的答案。我阅读并实施了以下几条建议:这这个问题让我得到了我所寻找的东西,我想我将所有这些结合到这个问题中,以帮助未来想要做与我相同事情的新手。
如果我使用
cd ../
bash 尝试从脚本所在的同一目录打开文件。直接输入文件路径就可以了。在打开文件的每一行后面放置
&
都会执行下一行。我的实际脚本打开了更多文件,但这个例子似乎足够了。
我的工作脚本:
#! /bin/bash
cd '/home/me/Dropbox/00-School/03-TA POLI 397/Assignment'
libreoffice grading-instructions.odt &
cd '/home/me/Dropbox/00-School/03-TA POLI 397'
evince 'POLI 397 Assignment.pdf'