我有以下代码片段:
#!/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
)完全不同。因此,您面临着一项艰巨的任务。bash
ksh
解决问题的一种(混乱!)方法是:
$ 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