如何让目录的所有内容像在 CWD 中一样运行?

如何让目录的所有内容像在 CWD 中一样运行?

假设我有几个目录:

/Users/user1/ApplicationThing/
/Users/user1/Documents/
/Users/user1/other/directory/it/doesnt/matter/

main.sh假设其中有一个文件.../ApplicationThing/,它也依赖于另一个文件dependancy.sh

我希望能够位于任何其他目录中,并且能够运行main.shWD 作为我的 CWD,就好像内容.../ApplicationThing/目录位于系统上的每个其他目录中一样。不像 with $PATH,而是好像内容实际上在目录内部,但不应该在自动完成甚至ls -l.

答案1

这听起来应该修复 ApplicationThing 以从特定位置查找其依赖项,即使使用不同的工作目录调用也是如此。

您可以通过设置环境变量来做到这一点:

export ApplicationThingHome=/Users/user1/ApplicantionThing

并引用main.sh使用该变量值的所有依赖项(如果未设置变量,则可以选择一个很好的默认值),例如

${ApplicationThingHome:-/usr/local/ApplicationThingDefaultDir}/dependancy.sh

代替

./dependancy.sh

然后您可以将main.sh的目录放入任何目录中$PATH并从任何目录中使用它。

您提出的解决方案会有一个问题:如果您位于任何其他目录中并希望创建一个名为 或 的文件,main.sh那么dependency.sh您最终会覆盖 ApplicationThing 的相应文件。从字面上main.sh看,除了属于 ApplicationThing 的目录之外,您将无法拥有/使用任何其他目录...而目录的发明正是为了避免此类问题!

main.sh当然,您可以将其设为一个条件,即仅在首先执行时“伪文件”才会存在......但是您将需要另一组工具来查看所main.sh看到的内容,以便在它不执行时对其进行故障排除你所期望的。

如果您无法修复 ApplicationThing,您可以创建一个包装脚本来从系统上的任何位置调用 ApplicationThing,然后将$PATH 中包含的目录中的脚本:

#!/bin/sh
# set the correct working directory for silly ApplicationThing
cd /Users/user1/ApplicationThing
# if ApplicationThing has any other environment requirements, 
# this would be a great place to ensure they're satisfied too.

# Now execute the main.sh of ApplicationThing, giving it any 
# command line arguments that were given to this script, exactly as-is.
exec ./main.sh "$@"

由于该脚本将作为单独的进程执行,因此cd脚本中的命令根本不会影响调用该脚本的会话。exec运行中的关键字可以避免main.sh在调用 shell 和main.sh.

使用这种方法,如果main.sh将文件名作为参数,则必须将它们作为绝对路径名提供,因为任何相对路径名都将被解释为main.sh相对于 ApplicationThing 的目录,而不是相对于调用会话的 CWD。

如果这是一个问题,您可以在将命令行参数传递给main.sh.这个 StackExchange 问题有一些您可能会发现适用的想法。

相关内容