3

我有以下代码片段:

#!/bin/ksh

source /users/some_user/.cshrc

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

我也尝试过使用以下dot运算符:

#!/bin/ksh

. /users/some_user/.cshrc

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

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

4

4 回答 4

6

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

您的剩余问题是要读取的文件应该是ksh文件,而不是csh文件 - C shell 文件中的符号(例如)与 POSIX shell 中使用的符号( 、等setenv)完全不同。因此,您面临着一项艰巨的任务。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文件可能是最好的方法。


csh从到的超简单转换ksh

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

#!/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"

这不太可能是足够的,但它可能是一个足够的开始让你开始。

于 2013-08-13T19:12:39.040 回答
2

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

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

. /users/some_user/.cshrc
于 2013-08-13T19:29:09.557 回答
1

你能试试吗

file /users/some_user/.cshrc

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

在 .cshrc 中添加 echo 语句将表明它已运行。

请注意,这是source行不通的,因为它被csh而不是ksh脚本的事实所迷惑。

读这个

于 2013-08-13T19:21:46.893 回答
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
于 2013-08-13T19:11:06.343 回答