【问题标题】:sourcing a file containing env variables from ksh从 ksh 获取包含环境变量的文件
【发布时间】:2013-08-13 19:04:26
【问题描述】:

我有以下sn-p的代码:

#!/bin/ksh

source /users/some_user/.cshrc

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

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

#!/bin/ksh

. /users/some_user/.cshrc

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

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

【问题讨论】:

  • 来自ksh?假设它确实是.cshrc 中的csh 格式,您必须编写一个过滤器来将csh 语法转换为ksh。你最好拥有同一个 .rc 文件的 2 个版本,1 个是 csh 语法,另一个是 ksh 语法。 ELSE 教育您的问题,以包含 .cshrc 文件中的一些代码。祝你好运。

标签: unix ksh


【解决方案1】:

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

您的剩余问题是要读取的文件应该是 ksh 文件,而不是 csh 文件 - C shell 文件中的符号(例如 setenv)与使用的符号完全不同在 POSIX 外壳中(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"

这可能还不够,但它可能足以让您开始前进。

【讨论】:

  • 另请参阅tripleeeanswer 以获得有趣的替代方案。我创建了一个简单的 setenv() { export "$1"="$2"; } 并使用 . cshrc 来正确设置 VAR 和 VAR_2 值。如果.cshrc 文件中有其他 C shell 操作,尤其是条件操作,这将无济于事,但这也是大纲 Perl 脚本的限制。
【解决方案2】:

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

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

. /users/some_user/.cshrc

【讨论】:

  • 有趣...你能把它压缩成:export "$1"="$2"吗? eval 不是必需的,不是吗?
  • 我猜你是对的;感谢您的反馈!相应更新。
  • 我喜欢你所做的——我在对我的回答的评论中引用了它。
【解决方案3】:

你可以试试

file /users/some_user/.cshrc

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

在 .cshrc 中加入一个 echo 语句将表明它已经运行。

请注意source 不能工作,因为它是一个 csh 而不是 ksh 脚本这一事实让它感到困惑。

还有 read this

【讨论】:

    【解决方案4】:

    它适用于我的点运算符:

    $ 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
    

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 1970-01-01
      • 2014-02-01
      • 2014-08-01
      • 2019-05-15
      • 2017-03-06
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      相关资源
      最近更新 更多