【问题标题】:Script not working as Command line脚本不能作为命令行工作
【发布时间】:2024-08-21 05:50:01
【问题描述】:

我创建了执行以下操作的简单 bash 脚本 :

#!/usr/bin/env bash
cf ssh "$1"

当我像 cf ssh myapp 这样从 CLI 运行命令行时,它会按预期运行,但是当我像这样运行脚本时

. myscript.sh myapp 

我收到错误:找不到应用

我不明白有什么区别,我在调用脚本后提供了应用程序名称,这里可能缺少什么?

更新

当我使用以下脚本运行脚本时,知道为什么“$1”不起作用...

#!/usr/bin/env bash
cf ssh myapp

【问题讨论】:

  • 您为什么要获取 (.) 脚本? cf 是别名、命令还是其他东西,它在哪里以及如何安装/定义?错误消息看起来像是来自 cf 的内容,这可能不是编程问题。
  • 我不使用cf,但您在打开 TTY 并尝试通过 ssh 连接到另一个 tty 时似乎会遇到麻烦。你试过cf ssh 没有任何程序名称,所以你可以看看它是否有效。您也可以尝试通过cf -i 更改您应用的实例,但我不确定这是否会有所帮助。
  • @tripleee - 脚本的来源 (.) 是什么意思?我怎么能称之为不同。 myscript 应用名称?我从能够运行命令 cf ssh myapp (有效)的同一路径运行脚本我只想创建一些运行它的脚本...
  • @suleiman - 是的,当我准确地输入脚本时,我需要的命令就像 cf ssh myapp 它的工作......唯一的区别是在脚本中我想传递一个参数 "$1" 。 ..
  • 创建脚本时,您可以随意命名。然后你需要让它可以执行mod +x filename。您可以通过./scriptname 调用脚本,或者将 bin 文件夹添加到 home 并为其添加一些权限。或者使用文件夹/usr/local/bin 来存储脚本和类似文件。顺便说一句,这些文件将在没有任何点或斜杠的情况下被调用。正常的 bash 声明是 #!/bin/bash,其中没有 env。

标签: bash shell terminal


【解决方案1】:

当你这样做时:

. myscript.sh myapp

您不运行脚本,但您获取第一个参数中命名的文件。采购意味着读取文件,所以就好像文件中的行是在命令行上键入的。在你的情况下会发生什么:

  • myscript.sh 被视为源文件,myapp 参数被忽略。

  • 此行被视为注释并被跳过。

    #!/usr/bin/env bash
    
  • 这一行:

    cf ssh "$1"
    

    按原样阅读。 "$1" 在调用 shell 中采用 $1 的值。可能 - 在你的情况下很可能 - 它是空白的。

现在您应该知道为什么当您获取此版本的脚本时它会按预期工作:

#!/usr/bin/env bash
cf ssh myapp 

没有$1要解决,所以一切都很顺利。

运行脚本并能够将参数传递给它,您需要使文件可执行然后执行它(而不是采购)。例如,您可以这样执行脚本:

./script.bash arg1 arg2

【讨论】: