Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 脚本中的变量在脚本内部看不到(csh、tcsh)_Bash_Csh_Tcsh - Fatal编程技术网

Bash 脚本中的变量在脚本内部看不到(csh、tcsh)

Bash 脚本中的变量在脚本内部看不到(csh、tcsh),bash,csh,tcsh,Bash,Csh,Tcsh,我想设置一个指示目录的变量,并使用它访问该目录中的文件。 所以我写了一个简单的脚本(注意我没有把#!/bin/csh放在前面) 文件测试: set dir1=/tmp ls -l $dir1 我做了chmod+x测试并运行了test,但它只是显示了我的当前目录,比如$dir1就是空的。我试图使用{XX}但没有用 我不想用它/usr/bin/env tcsh或#/bin/csch或#/bin/tcsh。不可能吗?(我不想启动新的shell,但要使用相同的别名和其他以前的环境变量等) 怎么了?我在

我想设置一个指示目录的变量,并使用它访问该目录中的文件。
所以我写了一个简单的脚本(注意我没有把#!/bin/csh放在前面)

文件测试:

set dir1=/tmp
ls -l $dir1
我做了
chmod+x测试
并运行了
test
,但它只是显示了我的当前目录,比如$dir1就是空的。我试图使用{XX}但没有用

我不想用它/usr/bin/env tcsh或#/bin/csch或#/bin/tcsh。不可能吗?(我不想启动新的shell,但要使用相同的别名和其他以前的环境变量等)

怎么了?我在tcsh做这件事

添加 我后来发现了

dir1=/tmp
ls $dir1

是答案。

您应该将shebang添加到脚本中,以强制使用tcsh 否则将使用默认shell!!! 您的变量定义/赋值语法可能无法按预期工作

将以下第一行添加到脚本中

#!/usr/bin/env tcsh

您应该将shebang添加到脚本中,以强制使用tcsh 否则将使用默认shell!!! 您的变量定义/赋值语法可能无法按预期工作

将以下第一行添加到脚本中

#!/usr/bin/env tcsh

简短回答:根据您的评论,您需要使用
source
命令运行脚本(请参阅@ghoti的comment)

详细回答:有许多不同的方式来运行shell脚本,对于它的运行方式有不同的含义

  • 通常,运行脚本的首选方法是让脚本以shebang(
    #!
    )行开头,指定要用于它的解释器(/bin/sh、/bin/bash等),然后将脚本放在路径中的目录中并按名称执行,或者指定脚本的路径作为命令(请注意,
    /scriptname
    是这种情况的特例,路径是“就在这里”)

    使用此方法,将创建一个运行指定解释器的子进程并执行脚本。由于脚本在子进程中执行,因此其中设置的环境变量等不会影响从中运行的shell的环境(即设置
    dir1=/tmp
    仅适用于脚本内部,而不是在脚本完成后)

  • 如果脚本没有shebang,您也可以按名称或路径运行它。这也会创建一个运行某个解释器的子进程(这是一个有点糟糕的解释器)。没有理由这样做;使用shebang

  • 可以通过显式调用解释器来运行脚本,如
    sh/path/to/script
    bash/path/to/script
    、或
    csh/path/to/script
    。请注意,如果脚本位于当前目录中,则不需要完整路径;其名称已足够。这也会在子进程中运行脚本,但会使用指定的iinterpreter(如果有shebang行,则忽略该行)

    如果您指定了错误的解释器(例如,对于仅使用bash功能的脚本使用
    sh
    ),则此解释器有时会导致问题,并且只有在某些情况阻止您使用第一个选项时才应使用此解释器

  • 最后,您可以使用
    source
    命令运行脚本(例如
    source/path/to/script
    source scriptname
    ,如果它在当前目录中)。与其他脚本不同,这不会创建子进程;它会告诉当前shell从文件中执行命令。这意味着脚本最好使用适用于当前shell的正确语法编写;如果您
    source
    csh或tcsh中的bash或sh脚本,则不会正常运行。这还意味着shebang(如果有的话)被忽略

    如果希望脚本中的环境变量定义在运行脚本的shell中可用,这是唯一的方法。(除了在类似sh的shell中,您可以使用
    命令,因为这是
    源代码的同义词)

    由于当脚本为
    source
    d时,任何shebang行都会被忽略,因此您可以将其包含在内,也可以不包含在内。我倾向于将shebang添加到应该为source
    d的脚本中,或者给用户提供正确的解释程序作为提示,或者如果有人试图在没有
    source`的情况下运行脚本,则使用
    #!/bin/echo
    shebang打印消息:

    #!/bin/echo source this script from csh: source
    
    …这是一种黑客行为,因为
    /bin/echo
    不是解释器;但它将从csh:source/path/to/script
    运行命令
    /bin/echo source此脚本,它至少为用户指明了正确的方向。请注意,这并不能防止有人用
    sh
    bash
    ,重写shebang,等等


顺便说一句,关于不兼容命令的一些其他注意事项:正如我所说,
set
在类似sh和类似csh的shell中执行完全不同的操作。在类似csh的shell中,可以使用
set var=value
分配变量,但在类似sh的shell中
set
设置脚本的位置参数(
$1
$2
,等等),因此
set var=value
$1
设置为字符串“var=value”。此外,在您的回答中,您使用的是
dir
命令——这根本不是unix命令,而是DOS命令;这表明您正在Windows下运行这些脚本,在这种情况下,可能会存在其他一类潜在的兼容性混淆。

简短回答:根据您的评论,您需要使用命令运行脚本e> source
命令(参见@ghoti的命令)

详细回答:有许多不同的方式来运行shell脚本,对于它的运行方式有不同的含义

  • 通常,运行脚本的首选方法是让脚本以shebang(
    #!
    )行开头,指定要用于它的解释器(/bin/sh、/bin/bash等),然后将脚本放在路径中的目录中并按名称执行,或者指定脚本的路径作为命令(注意,
    /scriptname
    是这种情况的特例,
    1% setenv foo bar
    2% echo $foo
    bar
    3% csh
    1% echo $foo
    bar
    2%
    
    alias go 'cd `dirname \!:*`'
    
    1% alias go 'cd `dirname \!:*`'
    2% go /usr/local/etc/foo.rc
    3% pwd
    /usr/local/etc
    4%