我有以下代码片段:
#!/bin/ksh
source /users/some_user/.cshrc
但是,运行它会产生source: not found错误。
我也尝试过使用以下dot运算符:
#!/bin/ksh
. /users/some_user/.cshrc
但是,这也不能解决问题,尽管它不再给我source: not found错误。
获取文件的正确方法是什么.cshrc?
要读取 中的文件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"
这不太可能是足够的,但它可能是一个足够的开始让你开始。
如果只是一堆setenv调用,您可以定义自己的 ksh 函数。
setenv () {
export "$1"="$2"
}
. /users/some_user/.cshrc
你能试试吗
file /users/some_user/.cshrc
确认文件在您认为的位置。点运算符将执行该文件。
在 .cshrc 中添加 echo 语句将表明它已运行。
请注意,这是source行不通的,因为它被csh而不是ksh脚本的事实所迷惑。
也 读这个
它适用于我的点运算符:
$ 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
就像已经说过的那样,您无法获取csh文件。要在 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