首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bash:如何将脚本名称分配给变量并从另一个脚本调用它

bash:如何将脚本名称分配给变量并从另一个脚本调用它
EN

Stack Overflow用户
提问于 2015-10-24 12:29:00
回答 2查看 1.6K关注 0票数 3

我有一个简单的bash脚本,它自己正确地工作,第二个脚本,在某个时候应该调用第一个脚本并执行它。在第二个脚本中,我将第一个脚本的名称分配给一个变量,然后尝试用:sh ${VARIABLE}调用它

我面临的问题是:

${VARIABLE}正确地存储脚本的名称时,行sh ${VARIABLE}返回一个空值,因此不会执行脚本。

守则的有关部分:

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

comp(){
    # Check if user is root
    if [ ! $(whoami) == "root" ]; then
        echo "Need root!"
        exit 1
    fi
    export make="make -j4"
    cd ${THISCWD}/${THISPRG}/${SRCDIR}/
    PRGSCRIPT="${THISPRG}-1510.sh"
# echo $(pwd)
# echo $PRGSCRIPT
# echo $(ls | grep "20151013-b4-1510.sh")
# echo $(ls | grep "${PRGSCRIPT}")
    sh ${PRGSCRIPT}
}

评论掉了回声,我把它们包括进来,企图惹麻烦。当我取消注释时,前三个返回期望值,而第四个返回空行:

代码语言:javascript
运行
复制
# echo $PRGSCRIPT
20151013-b4-1510.sh
# echo $(ls | grep "20151013-b4-1510.sh")
20151013-b4-1510.sh
# echo $(ls | grep "${PRGSCRIPT}")
   # (<- I get an empty line here)

当我运行我的脚本时,我会得到一个No such file or directory错误。

我一直在搜索答案,并在Stackoverflow中搜索,但我认为我没有使用正确的搜索词,因为我得到了关于如何将变量值或参数从一个脚本传递到另一个脚本的答案。

我已经尝试了几个小时来解决这个问题,使用set -x; trap read debug并在任何地方放置echo,以确保我的所有变量和路径都是正确的。

我尝试在变量周围添加引号,删除引号和花括号,并显式地分配变量名:即使这样,名为returns的脚本仍然是空的。

我调用的脚本以#!/bin/bash (绝对没有^M^r或任何Windows样式的换行符或符号)开始,在我的pc /bin/sh中,它是到/bin/bash的软链接。尽管如此,我还是尝试用/bin/bash而不是sh调用第二个脚本,这并没有什么区别。

另外,由于我的脚本需要切换用户,所以在调用脚本时,我确保所有变量都列在脚本中。

如果我直接在shell上传递所有变量和函数,然后调用它comp,它将正确地执行第二个脚本。

我很确定我在这里做的是一个典型的新手错误,我会非常感激任何的洞察力。抱歉,我这么长篇大论,我不知道要包括多少细节。

已更新

@shellter评论:

ls -l -- "$PRGSCRIPT"给出ls: cannot access 20151013-b4-1510.sh: No such file or directory,而echo $PRGSCRIPT正确地返回文件名。

我没有包含所有的脚本,第一部分设置了所有变量(${THISCWD}${THISPRG}等)。另外,当我做测试echo $(pwd)时,它显示我在正确的路径上。我越来越困惑.

此外,Windows编辑没有涉及到进程的任何部分,我在Linux中对两个脚本都使用了vi,并且只在本地机器中使用,不涉及ftp。路径上也没有空格。

关于相关的挂载输出:我不知道你的意思。根分区在/dev/sda1中,我的主分区在/dev/sda5中。我的$PATH正确地看到了/bin/usr/bin

谢谢您的时间-我正在按您的建议更新问题,以避免冗长的评论列表。

针对评论意见,提供更多最新情况:

@贝壳

代码语言:javascript
运行
复制
# mount | egrep 'sda1|sda5'
/dev/sda1 on / type ext4 (rw)
/dev/sda5 on /home type ext4 (rw)

我将确保再次检查脚本文件夹中的权限(很棒的脚本,顺便说一句)--希望您不介意我会使用它!但是,由于我在运行脚本之前实际上是su,所以我认为这不会是权限问题

@couling

我在这里面确实发现了一个问题!按照您的建议,我在ht中测试了输出,并在行的每一端都得到了一个不可打印的字符:

代码语言:javascript
运行
复制
│00000000 23 23 23 32 30 31 35 31-30 31 33 2d 62 34 2d 31 |###20151013-b4-1|                             │
│00000010 35 31 30 2e 73 68 23 23-23 0a                   |510.sh###?      |

我所有的台词都以一个0a字符结尾..。在ls.txt文件中也是如此。我不知道怎么解决这个问题,有什么建议吗?不认为vivim会添加新的行字符。

更新的ls.txt

代码语言:javascript
运行
复制
│00000000 74 6f 74 61 6c 20 36 34-0a 64 72 77 78 72 2d 78 |total 64?drwxr-x|                             ^
│00000010 72 2d 78 20 32 20 62 34-74 73 74 73 20 75 73 65 |r-x 2 b4tsts use|                             ▒
│00000020 72 73 20 34 30 39 36 20-4f 63 74 20 31 31 20 30 |rs 4096 Oct 11 0|                             ▒
│00000030 38 3a 30 32 20 32 30 31-35 31 30 30 31 0a 64 72 |8:02 20151001?dr|                             ▒
│00000040 77 78 72 2d 78 72 2d 78-20 32 20 62 34 74 73 74 |wxr-xr-x 2 b4tst|                             ▒
│00000050 73 20 75 73 65 72 73 20-34 30 39 36 20 4f 63 74 |s users 4096 Oct|                             ▒
│00000060 20 31 31 20 30 38 3a 30-32 20 32 30 31 35 31 30 | 11 08:02 201510|                             ▒
│00000070 30 32 0a 64 72 77 78 72-2d 78 72 2d 78 20 32 20 |02?drwxr-xr-x 2 |                             ▒
│00000080 62 34 74 73 74 73 20 75-73 65 72 73 20 34 30 39 |b4tsts users 409|                             ▒
│00000090 36 20 4f 63 74 20 31 31-20 30 38 3a 30 32 20 32 |6 Oct 11 08:02 2|                             ▒
│000000a0 30 31 35 31 30 30 33 0a-64 72 77 78 72 2d 78 72 |0151003?drwxr-xr|                             ▒
│000000b0 2d 78 20 32 20 62 34 74-73 74 73 20 75 73 65 72 |-x 2 b4tsts user|                             ▒
│000000c0 73 20 34 30 39 36 20 4f-63 74 20 31 31 20 30 38 |s 4096 Oct 11 08|                             ▒
│000000d0 3a 30 34 20 32 30 31 35-31 30 30 34 0a 64 72 77 |:04 20151004?drw|                             ▒
│000000e0 78 72 2d 78 72 2d 78 20-32 20 62 34 74 73 74 73 |xr-xr-x 2 b4tsts|                             ▒
│000000f0 20 75 73 65 72 73 20 34-30 39 36 20 4f 63 74 20 | users 4096 Oct |                             ▒
│00000100 31 31 20 30 37 3a 33 31-20 32 30 31 35 31 30 30 |11 07:31 2015100|                             ▒
│00000110 35 0a 64 72 77 78 72 2d-78 72 2d 78 20 32 20 62 |5?drwxr-xr-x 2 b|                             ▒
│00000120 34 74 73 74 73 20 75 73-65 72 73 20 34 30 39 36 |4tsts users 4096|                             ▒
│00000130 20 4f 63 74 20 31 36 20-32 32 3a 33 34 20 32 30 | Oct 16 22:34 20|                             ▒
│00000140 31 35 31 30 30 36 0a 64-72 77 78 72 2d 78 72 2d |151006?drwxr-xr-|                             ▒
│00000150 78 20 32 20 62 34 74 73-74 73 20 75 73 65 72 73 |x 2 b4tsts users|                             ▒
│00000160 20 34 30 39 36 20 4f 63-74 20 31 36 20 32 32 3a | 4096 Oct 16 22:|                             ▒
│00000170 33 34 20 32 30 31 35 31-30 30 37 0a 64 72 77 78 |34 20151007?drwx|                             ▒
│00000180 72 2d 78 72 2d 78 20 32-20 62 34 74 73 74 73 20 |r-xr-x 2 b4tsts |                             ▒
│00000190 75 73 65 72 73 20 34 30-39 36 20 4f 63 74 20 31 |users 4096 Oct 1|                             ▒
│000001a0 36 20 32 32 3a 33 34 20-32 30 31 35 31 30 30 38 |6 22:34 20151008|  

部分输出:这里还有0a字符。我检查了所有显示为?他们都是0a

更新

最后,我在一个新文件中复制了脚本的大部分部分(减去注释和echo ),现在,由于某种原因,它按预期的方式工作.

我仍然不知道发生了什么或者我的问题是什么。

我非常感谢你们的帮助,在这个过程中我学到了一些东西。我非常感谢你们抽出时间来帮助我。

EN

回答 2

Stack Overflow用户

发布于 2015-10-24 14:19:22

这是很难给出一个明确的答案,但它似乎有一个不可打印的字符在那里的某处。我指的是不可打印的\r和其他字符。我知道你已经说过变量中没有\r

这可以在变量中,也可以在文件名中。

我会做一个ls -l > ls.txt并将您的脚本运行到echo "###${PRGSCRIPT}###" > prgscript.txt。然后,我会找到一个很好的十六进制编辑器来分析结果(一个显示沿六角的任务)。从您在这里发布的内容来看,我希望在输出中看到一个不一致的地方(很可能涉及一个不可打印的字符)。

在变量回波中尾随###之前,要特别注意新行字符。

票数 1
EN

Stack Overflow用户

发布于 2015-12-08 13:54:28

首先,在cd之后检查状态代码,以确定它是否工作。

其次,编写验证了PRGSCRIPT的值20151013-b4-1510.sh。现在我们有三种可能性:

  1. 或者shell找到一个具有此名称的可读文件,在这种情况下它将以某种方式执行它(如果您想知道该文件中发生了什么,可以使用-x开关打开跟踪),或者
  2. shell将输出一条错误消息。

理论上,我们也有这样的情况,即文件不包含可执行命令(只包含注释行),但这是您可以单独研究的内容。

例如,做一个

代码语言:javascript
运行
复制
cat $PRGSCRIPT
sh -x $PRGSCRIPT

应该显示正在发生的事情(除非您将调用脚本的stdout和stderr重定向到位桶)。

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

https://stackoverflow.com/questions/33318198

复制
相关文章

相似问题

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