Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.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 与Shell无关的环境变量设置方法_Bash_Shell_Environment Variables_Tcsh - Fatal编程技术网

Bash 与Shell无关的环境变量设置方法

Bash 与Shell无关的环境变量设置方法,bash,shell,environment-variables,tcsh,Bash,Shell,Environment Variables,Tcsh,我需要制作一个脚本,可以修改调用shell的环境变量。为了允许脚本修改环境变量,我正在使用source,我希望bash和tcsh能够使用相同的脚本 我发现tcsh和bash具有不同的if语法,因此我甚至无法在脚本中的这两种语法之间切换。处理设置环境变量的最佳方法是什么?我不喜欢写一个答案,它只不过是扩展了作者对原始问题的评论。但我觉得重要的是,你需要考虑的不仅仅是POSIX 1003炮弹,比如BASH和经典的炮弹,比如CSH/TCSH。你还需要考虑现代的替代品,这与那些壳中的任何一个都不兼容。

我需要制作一个脚本,可以修改调用shell的环境变量。为了允许脚本修改环境变量,我正在使用
source
,我希望bash和tcsh能够使用相同的脚本


我发现tcsh和bash具有不同的
if
语法,因此我甚至无法在脚本中的这两种语法之间切换。处理设置环境变量的最佳方法是什么?

我不喜欢写一个答案,它只不过是扩展了作者对原始问题的评论。但我觉得重要的是,你需要考虑的不仅仅是POSIX 1003炮弹,比如BASH和经典的炮弹,比如CSH/TCSH。你还需要考虑现代的替代品,这与那些壳中的任何一个都不兼容。 正如@Ash所指出的,解决方案是为每个调用shell使用“桥接”代码,将信息映射到适合调用shell的语法中。

Ok。我做了一些实验,你可以用一个脚本来完成。(更新:我把原来的方法复杂化了,这里有一个更好的解决方案,它也适用于zsh。)

您试图创建的是一个bash/tcsh polyglot(我们现在假设您不想支持任何其他shell)。我将把实际的多语言文字放在这里,然后是一些解释和注意事项:

if ( : != : ) then
    echo "In a POSIX shell or zsh or ksh"
else
    echo "In tcsh"
    alias fi :
endif
fi
第一行是这个多语言游戏中最有趣的部分

在POSIX sh中,它创建一个子shell来运行带有两个参数的命令
==
<代码>:始终返回true,因此执行if语句的第一个分支。(通常在if语句中的条件后使用分号,但实际上close paren也起作用,因为两者都是控制运算符,可用于结束简单命令–if语句中的条件实际上是一个列表,但根据Bash手册,它退化为一个简单命令。)

在tcsh中,它将字符串
与字符串
进行比较–因为它们相等,并且我们正在测试不相等性,所以它执行第二个分支

第二个(tcsh)分支的最后一行只是确保tcsh不会抱怨最后的
fi
不是命令。在第一个分支中不需要类似的别名,因为就POSIX shell而言,
endif
仍然在if语句的第二个分支中


关于警告,您在POSIX shell部分中实际可以做的事情有些有限:例如,您不能用POSIX语法(
foo(){…}
)定义任何函数,因为tcsh会抱怨括号,尽管Bash语法(
function foo{…}
)可以工作。我假设tcsh部分也有类似的限制


这种多基因杂交在鱼类中也不起作用,尽管它在zsh中起作用。(这就是为什么条件是
:!=:
而不是类似于
:=''
——在zsh中,
==
扩展到命令路径
=
,该路径不存在。)它似乎也在ksh中工作(尽管在这一点上,它变得不是一个多语言的程序,而是一个“Isthis shell csh”程序……)

在您正在寻找的脚本之外检测shell,并对POSIX shell和tcsh使用两种不同的脚本:)编写一个同时在POSIX sh和tcsh中工作的脚本可能会非常痛苦(但可能并非实际上不可能,因为两者都支持
|
&
..),这正是我所担心的。谢谢你让我知道问题:你为什么使用两种不同的shell语言?坚持一个可能是一个更好的长期战略。我强烈同意cdarke——做通常的事情,让
yourscript.csh
yourscript.bash
来获取想要的东西,并让用户做出适当的选择是明智的。csh语法是,写任何实质性的东西都需要尽量避免妥协。旁白:
function foo{…}
可以追溯到POSIX之前的ksh;混合
函数foo(){…}
是一种bashism,既不兼容POSIX也不兼容ksh。@CharlesDuffy噢,哇,这真是太酷了——我不知道。听起来人们通常称之为bashism的其他一些特性,比如
[[
,实际上也是来自ksh!