在bash中将目录更改为父/调用脚本的路径

PSV*_*ter 1 linux bash shell talend

我有几十个脚本,都在不同的目录中.(导出/扩展的Talend工作)

此时每个作业都有1或2个脚本,从相同的行开始,最重要的一行:

CD ***path-to-script***
Run Code Online (Sandbox Code Playgroud)

和几行来设置Java路径并启动作业.

我想创建一个脚本,它将从所有这些脚本运行.例如:

/scripts/talend.sh
Run Code Online (Sandbox Code Playgroud)

在所有talend脚本中,第一行将运行/scripts/talend.sh,这些脚本的运行位置的一些示例:

/talend-job1_0.1/talend-job1_0.1/talend-job1/talend-job1.sh
/talend-task2_0.1/talend-task2_0.1/talend-task2/talend-task2.sh
/talend-job3_0.1/talend-job3_0.1/talend-job3/talend-job3.sh
Run Code Online (Sandbox Code Playgroud)

如何确定/scripts/talend.sh从何处开始,因此我可以从内部CD到该路径/scripts/talend.sh.

Talend脚本不是从目录本身运行,而是从cronjob或不同的用户主目录运行.

编辑:问题被标记为重复,但从内部获取Bash脚本的源目录不是100%回答我的问题.问题是: - 从不同的脚本调用基本脚本 - 这些不同的脚本可以从命令行运行,带有或不带符号链接. - $ 0,$ BASH_SOURCE和pwd都做了一些事情,但没有提到的解决方案涵盖了所有的困难.

例:

/scripts/talend.sh   
Run Code Online (Sandbox Code Playgroud)

在这个脚本中,我想配置Java的$ PATH和$ HOME_PATH,并将CD配置到Talend作业所在的位置.(它是一个包,所以脚本必须从该位置运行).

例如,工作路径是:

/u/talend/talendjob1/sub../../talendjob1.sh 
/u/talend/talendjob2/sub../../talendjob2.sh
/u/talend/talendjob3/sub../../talendjob3.sh
Run Code Online (Sandbox Code Playgroud)

从TMS应用程序运行多个作业.此应用程序无法使用whol名称运行这些脚本(对于long,名称只能是6长),因此在不同的位置我有符号链接:

/u/tms/links/p00001 -> /u/talend/talendjob1/sub../../talendjob1.sh
/u/tms/links/p00002 -> /u/talend/talendjob1/sub../../talendjob2.sh
/u/tms/links/p00003 -> /u/talend/talendjob1/sub../../talendjob3.sh
/u/tms/links/p00004 -> /u/talend/talendjob1/sub../../talendjob4.sh
Run Code Online (Sandbox Code Playgroud)

我想你会对复杂性进行概述,为什么我只想要一个基本的talend脚本,在那里我可以留下所有基本内容.但我只能这样做,如果我知道Talend脚本的来源,因为我必须要开始那个talend工作.

Cha*_*ffy 5

这些答案(超出第一个)是特定于Linux的,但应该非常强大 - 使用包含空格,文字换行符,通配符等的目录名称.


要更改为您自己的源目录(其他地方的常见问题解答):

cd "$(basename "$BASH_SOURCE")"
Run Code Online (Sandbox Code Playgroud)

要更改为父进程的当前目录:

cd "/proc/$PPID/cwd"
Run Code Online (Sandbox Code Playgroud)

如果要更改为作为父进程的第一个命令行参数传递的目录:

{ IFS= read -r -d '' _ && IFS= read -r -d '' argv1; } <"/proc/$PPID/cmdline"
cd "$argv1"
Run Code Online (Sandbox Code Playgroud)

也就是说,我个人只是将作业目录导出到父进程中的环境变量,并在子进程中读取该环境变量.更简单,更简单,更便携,更准确,并符合最佳流程.