【问题标题】:Difference between source and ./ execution of linux scriptslinux脚本的source和./执行的区别
【发布时间】:2026-01-18 14:50:01
【问题描述】:

csh:

set a=0 
echo "a is $a"

当我这样做时 ./my_script.csh 输出是:

a is 

当我做 source my_script.csh 输出时:

a is 0 

为什么会这样。据我所知,./ 执行使用新的 shell。

【问题讨论】:

    标签: linux csh


    【解决方案1】:

    没错,./my_script.csh 启动一个新的 shell,并使用 #!您应该在文件顶部选择要运行的 shell(在这种情况下,应该是 csh)。

    source my_script.csh 在当前 shell 中运行脚本。

    如果脚本在例如 bash shell 中运行不正确,那么 set a=0 不是在 bash 中设置环境变量的语法,因此代码将无法按预期工作,因为您正在使用错误的外壳。

    看看#!在文件的顶部。对吗?

    【讨论】:

    • 但我尝试不使用它并在两种情况下都使用 echo "$SHELL" 它显示 /bin/csh 。为什么会这样
    • 我什至不知道你可以有没有#的Linux脚本!在顶部!我今天学到了一些新东西。但我不知道他们。
    • 我猜当你不使用shebang-line时,使用/bin/sh,通常链接到bash。
    【解决方案2】:

    检查变量“a”是否已在当前 shell 中设置:

    set | grep '^a='
    

    请记住,一旦将脚本源代码到当前的 shell, 它的所有全局变量都在那里,直到未设置或退出当前 shell。 您可能需要启动一个新的 shell,获取脚本,结束退出 shell 以执行有效的测试。

    我不知道您的问题的背景,但您可能希望导出一些关键变量以便在每个子流程中都有它们的副本。

    【讨论】: