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等),然后将脚本放在路径中的目录中并按名称执行,或者指定脚本的路径作为命令(请注意,#!
是这种情况的特例,路径是“就在这里”) 使用此方法,将创建一个运行指定解释器的子进程并执行脚本。由于脚本在子进程中执行,因此其中设置的环境变量等不会影响从中运行的shell的环境(即设置/scriptname
仅适用于脚本内部,而不是在脚本完成后)dir1=/tmp
- 如果脚本没有shebang,您也可以按名称或路径运行它。这也会创建一个运行某个解释器的子进程(这是一个有点糟糕的解释器)。没有理由这样做;使用shebang
- 可以通过显式调用解释器来运行脚本,如
、sh/path/to/script
、或bash/path/to/script
。请注意,如果脚本位于当前目录中,则不需要完整路径;其名称已足够。这也会在子进程中运行脚本,但会使用指定的iinterpreter(如果有shebang行,则忽略该行) 如果您指定了错误的解释器(例如,对于仅使用bash功能的脚本使用csh/path/to/script
),则此解释器有时会导致问题,并且只有在某些情况阻止您使用第一个选项时才应使用此解释器sh
- 最后,您可以使用
命令运行脚本(例如source
或source/path/to/script
,如果它在当前目录中)。与其他脚本不同,这不会创建子进程;它会告诉当前shell从文件中执行命令。这意味着脚本最好使用适用于当前shell的正确语法编写;如果您source scriptname
csh或tcsh中的bash或sh脚本,则不会正常运行。这还意味着shebang(如果有的话)被忽略 如果希望脚本中的环境变量定义在运行脚本的shell中可用,这是唯一的方法。(除了在类似sh的shell中,您可以使用source
命令,因为这是源代码的同义词) 由于当脚本为
d时,任何shebang行都会被忽略,因此您可以将其包含在内,也可以不包含在内。我倾向于将shebang添加到应该为sourcesource
d的脚本中,或者给用户提供正确的解释程序作为提示,或者如果有人试图在没有
#!/bin/echosource`的情况下运行脚本,则使用
运行命令shebang打印消息:
…这是一种黑客行为,因为#!/bin/echo source this script from csh: source
不是解释器;但它将从csh:source/path/to/script/bin/echo
/bin/echo source此脚本,它至少为用户指明了正确的方向。请注意,这并不能防止有人用
,sh
,重写shebang,等等bash
顺便说一句,关于不兼容命令的一些其他注意事项:正如我所说,
set
在类似sh和类似csh的shell中执行完全不同的操作。在类似csh的shell中,可以使用set var=value
分配变量,但在类似sh的shell中set
设置脚本的位置参数($1
,$2
,等等),因此set var=value
将$1
设置为字符串“var=value”。此外,在您的回答中,您使用的是dir
命令——这根本不是unix命令,而是DOS命令;这表明您正在Windows下运行这些脚本,在这种情况下,可能会存在其他一类潜在的兼容性混淆。简短回答:根据您的评论,您需要使用- 通常,运行脚本的首选方法是让脚本以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%