【问题标题】:When running an npm bin'd (symlinked) script, how do I execute a relative script?运行 npm bin'd (symlinked) 脚本时,如何执行相关脚本?
【发布时间】:2019-08-08 13:22:28
【问题描述】:

这是一个小 lerna 项目,带有一个实现简单 cli 工具的子包

├── node_modules/...
├── package.json
└── packages/cli
              ├── lib
              │   ├── cli.sh
              │   └── other.sh
              └── package.json

工具在packages/cli/lib/cli.sh:

echo "Hi..."
./other.sh
# also tried other.sh

调用packages/cli/lib/other.sh

echo "...there"

子包 (packages/cli/package.json) 有 bin commadn "doit"

{
    "name": "@me/cli",
    "bin": {
        "doit": "./lib/cli.sh",
    }
}

而根package.json依赖于cli子包

{
    "name": "@me/root",
    "dependencies": {
        "@me/cli": "1.0.0",
    }
}

但是当我使用 bin 命令时,它从 .bin (Symlink) 文件夹运行


$ doit
Hi...
<projectDir>/node_modules/.bin/doit: line 1: ./other.sh: No such file or directory

如何让 shellscript 在通过符号链接调用时找到它的兄弟文件? (以对 CI 来说足够健壮的方式)

【问题讨论】:

    标签: bash npm lerna


    【解决方案1】:

    使用dirname $0

    一个shell脚本总是可以通过变量$0访问它的全名,并通过dirname $0推断它所在的目录。

    echo "Hi..."
    `dirname $0`/other.sh
    

    使其健壮

    如果脚本是从相对路径调用的,如您的示例中,$0 将反映这一点。如果您之前调用过cdpushd,该代码将停止工作。如果你需要支持,你必须检查 $0 是否在开头是绝对的,如果不是,则在前面加上 pwd

    if [[ ! $0 ~= ^/ ]]; then
       mypath=`pwd`/`dirname $0`
    else
       mypath=`dirname $0`
    fi
    

    然后您可以安全地调用$mypath/other.sh,即使在脚本中更改了工作目录之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 2018-06-06
      • 2019-09-26
      • 2020-07-01
      • 2015-09-06
      相关资源
      最近更新 更多