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

czc*_*ong 2 unix ksh

我有以下代码片段:

#!/bin/ksh

source /users/some_user/.cshrc
Run Code Online (Sandbox Code Playgroud)

但是,运行它会产生source: not found错误.

我也试过使用dot像这样的运算符:

#!/bin/ksh

. /users/some_user/.cshrc
Run Code Online (Sandbox Code Playgroud)

但是,这也不能解决问题,尽管它不再给我source: not found错误.

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

Jon*_*ler 5

要读入文件ksh,.(点)命令是正确的.只bash添加source从中借来的命令csh,但它是一个罗嗦的同义词..

你剩余的问题是,这是要读取的文件应该是一个ksh文件,而不是一个csh文件-在C shell文件(如符号setenv)与那些在POSIX壳(使用完全不同的bash,ksh等等).因此,你面临着一项艰巨的任务.

解决这个问题的一种方式(麻烦!)是:

$ exec csh
% source /users/some_user/.cshrc
% exec ksh
$ ...continue with the environment set by the .cshrc file...
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是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";
    }
}
Run Code Online (Sandbox Code Playgroud)

给定一个.cshrc文件包含:

# comment

setenv VAR value
setenv VAR_2 "value with spaces"
Run Code Online (Sandbox Code Playgroud)

输出是:

export VAR="value"
export VAR_2="value with spaces"
Run Code Online (Sandbox Code Playgroud)

这可能不够,但它可能是让你前进的充分开始.