假设我有几个目录:
/Users/user1/ApplicationThing/
/Users/user1/Documents/
/Users/user1/other/directory/it/doesnt/matter/
main.sh
假设其中有一个文件.../ApplicationThing/
,它也依赖于另一个文件dependancy.sh
。
我希望能够位于任何其他目录中,并且能够运行main.sh
WD 作为我的 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 问题有一些您可能会发现适用的想法。