首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >源头不认识cwd?

源头不认识cwd?
EN

Unix & Linux用户
提问于 2023-02-28 08:12:23
回答 2查看 48关注 0票数 0

我有一个bash脚本,它来源于一个文件,该脚本来自另一个文件:

代码语言:javascript
复制
script.sh:
cd /script/dir
source funcs.sh


funcs.sh:
...
source mode.sh

现在,当我从命令行/ script /dir中运行它时,这个脚本运行良好。但是当我从crontab运行它时,funcs.sh文件找不到mode.sh。可能是因为某些原因,cd /script/dir没有被传递给它?在脚本中有什么我可以做的吗,或者我需要在cron或者类似的文件中做什么?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2023-02-28 11:12:51

每个进程都有一个$PWD (工作目录) cron不在您的$HOME中运行。而不是在脚本中使用cd,您可以使用以下方法

代码语言:javascript
复制
#!/bin/bash

dir="$(dirname "$(readlink -f "$0")")"
echo $dir

$dir是脚本的位置目录。例如

代码语言:javascript
复制
$ cd /
$ bash /home/junaga/script.sh

输出/home/junaga,因为这是脚本位置

票数 1
EN

Unix & Linux用户

发布于 2023-02-28 09:38:39

可能出现的问题:

  1. 没有谢邦script.sh。如果cron被告知运行script.sh,那么它将像/bin/sh -c script.sh一样运行(除非crontab中的SHELL指向/bin/sh以外的其他东西,我们不知道这一点)。由于不存在shebang,这适用于:哪个shell解释器运行脚本而不使用shell?答案取决于您的cron使用的shell,我们不确定这一点。最终,可以选择sh或其他东西作为脚本的解释器。即使选择了sh,它也可能由dashbash或其他什么东西提供(默认情况下是在Ubuntu dash中,但我们不知道在您的情况下是否真的如此)。关键是,当脚本从cron启动时,我们并不真正知道script.sh的解释器是什么。我想在某些情况下,脚本可能根本不能从cron开始。当您从交互式shell运行脚本时,可能会选择不同的解释器,然后才能工作。
  2. cd /script/dir可能因某种原因而失败(示例)。
  3. source.的别名,但不是在所有的shell中。因为我们不了解解释器,所以我们不知道它是否理解source
  4. 即使解释器将source理解为.,参数也是funcs.sh,并且不包含/。在这种情况下,.的POSIX行为是在$PATH目录中搜索文件(在您的例子中是funcs.sh)。现在:
    • 即使您的$PATH包含. (即当前工作目录),cron中的相同变量可能也不包含它。
    • 只有当$PATH中的搜索失败时,一些shell才会尝试当前的工作目录。

若要修复,请执行以下操作:

  1. script.sh中使用shebang,这样您就可以控制在执行时将使用什么shell来解释script.sh。(根据您选择的外壳,修复(3)和(4)可能是必要的,也可能是不必要的;它们不会造成伤害,所以如果有任何疑问,无论如何都要应用它们。)
  2. 如果cd失败,则中止。如果脚本在cd失败后继续运行,那么脚本可能试图从错误的目录中获取funcs.sh
  3. 使用.而不是source。前者是便携的,后者不是。
  4. 使用包含/的显式路径(在本例中是./funcs.sh而不是funcs.sh),因此在$PATH中没有搜索,而且很清楚您指的是哪个文件。

固定的script.sh类似于:

代码语言:javascript
复制
#!/bin/sh
cd /script/dir || exit 1
. ./funcs.sh

funcs.sh内部,不需要使用shebang,因为这个文件是由解释script.sh的shell提供的,但是修复(3)和(4)仍然是必要的(取决于所选的shell)。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/737179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档