从ksh获取包含env变量的文件

时间:2013-08-13 19:04:26

标签: unix ksh

我有以下代码片段:

#!/bin/ksh

source /users/some_user/.cshrc

但是,运行此操作会出现source: not found错误。

我也尝试使用dot运算符,如:

#!/bin/ksh

. /users/some_user/.cshrc

但是,这也无法解决问题,但它不再给我source: not found错误。

获取.cshrc文件的正确方法是什么?

4 个答案:

答案 0 :(得分:5)

要读取ksh中的文件,.(点)命令是正确的。只有bash添加了从source借来的csh命令,但它是.的一个冗长的同义词。

您的剩余问题是要读取的文件应该是ksh文件,而不是csh文件 - C shell文件中的符号(例如setenv)与POSIX shell(bashksh等中使用的完全不同。因此,你面临着一项艰巨的任务。

处理问题的一种方法是:

$ exec csh
% source /users/some_user/.cshrc
% exec ksh
$ ...continue with the environment set by the .cshrc file...

这样做的缺点是exec操作必须手动执行(或者至少,编程上很难执行)。另一种方法是将.cshrc文件转换为ksh表示法(使用export VAR=value代替setenv VAR value等)。

如果您想自动化它,翻译.cshrc文件可能是最好的方法。


cshksh

的超简单转换

作为一个非常粗略,简单的起点,请考虑:

#!/usr/bin/env perl
use strict;
use warnings;

while (<>)
{
    next if m/^#/;
    chomp;
    if (m/^\s* setenv \s+ (\w+) \s+ (.+) $/x)
    {
        my($var, $val) = ($1, $2);
        $val = "\"$val\"" unless $val =~ m/^"/;
        print "export $var=$val\n";
    }
}

给定.cshrc文件包含:

# comment

setenv VAR value
setenv VAR_2 "value with spaces"

输出结果为:

export VAR="value"
export VAR_2="value with spaces"

这不太可能,但这可能是让你前进的充分开始。

答案 1 :(得分:2)

如果它只是一堆setenv次调用,您可以定义自己的ksh函数。

setenv () {
    export "$1"="$2"
}

. /users/some_user/.cshrc

答案 2 :(得分:1)

你能试试吗

file /users/some_user/.cshrc

确认文件是您认为的位置。 点运算符执行该文件。

在.cshrc中放置一个echo语句将显示它已被运行。

请注意source无法正常工作,因为它的 csh 而不是 ksh 脚本会让人感到困惑。

另外 read this

答案 3 :(得分:0)

它适用于我的点运算符:

$ echo $SHELL
/bin/bash
$ ksh
$ cat l
foo=bar
$ . /tmp/l
$ echo $foo
bar

我的ksh版本:

$ echo $KSH_VERSION
echo $KSH_VERSION
@(#)PD KSH v5.2.14 99/07/13.2

如前所述,您无法获取文件。要在ksh中转换csh文件,可以测试此sed命令:

sed -rn '/setenv/{s@^\s*setenv\s+(\S+)\s+(\S+)@export \1=\2@;p}' /users/some_user/.cshrc |
    tee /users/some_user/.kshrc_env_file