我的目录中有一个 shell 脚本/bin
,其中有一行:play applause.mp3
。该文件applause.mp3
与可执行文件位于同一目录中。
然而 play 命令给了我错误play FAIL formats: can't open input file 'applause.mp3': No such file or directory
。
如果我直接从目录打开该文件,则可以正常播放/bin
。很明显,该.mp3
文件需要驻留在/bin
目录之外的其他位置。 bash 去哪里寻找文件?
答案1
Bash 查找要在PATH
环境变量指定的目录中执行的命令。
但是,在您的场景中,bash 已经完成了它的工作并运行了play
命令。applause.mp3
作为参数传递。这完全取决于play
命令如何解释它。
在命令采用文件名参数的常见情况下,它将解析从当前目录开始的路径(这就是为什么当您在/bin
调用脚本之前将目录更改为时它对您有用)。
/
为了避免出现问题,您应该在参数中使用绝对路径(以 开头)。
答案2
程序不会在可执行文件所在的目录中查找用户数据文件。他们有时会在同一目录中查找配置文件或静态数据文件(但这并不常见)。但用户数据和安装的程序几乎不会位于同一目录中——程序通常位于不允许用户写入的系统目录中,而用户的文件通常位于其主目录下。
当您将文件名传递给程序时,它会被解释为当前工作目录。每个进程都有一个当前工作目录,它是进程环境的一部分,与特定程序无关。通常从主目录启动,并且可以使用 shell 命令cd
转到另一个目录。从 shell 启动的任何程序都会继承 shell 的当前目录。
当您运行时play applause.mp3
,它将查找applause.mp3
当前目录中调用的文件。可执行文件所在的目录play
无关紧要。
如果您想使用无论当前目录是什么都有效的文件名,请传递一个绝对文件名(以 a 开头/
)。在 shell 脚本或命令行中,您可以~
在开头使用缩写来引用您的主目录。例如,在位于主目录的子目录中的文件上play ~/music/applause.mp3
运行。play
applause.mp3
music
1他们可以,但他们几乎不这样做。