我有以下代码片段:
#!/bin/ksh
source /users/some_user/.cshrc
但是,运行此操作会出现source: not found
错误。
我也尝试使用dot
运算符,如:
#!/bin/ksh
. /users/some_user/.cshrc
但是,这也无法解决问题,但它不再给我source: not found
错误。
获取.cshrc
文件的正确方法是什么?
答案 0 :(得分:5)
要读取ksh
中的文件,.
(点)命令是正确的。只有bash
添加了从source
借来的csh
命令,但它是.
的一个冗长的同义词。
您的剩余问题是要读取的文件应该是ksh
文件,而不是csh
文件 - C shell文件中的符号(例如setenv
)与POSIX shell(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"
这不太可能,但这可能是让你前进的充分开始。
答案 1 :(得分:2)
如果它只是一堆setenv
次调用,您可以定义自己的ksh函数。
setenv () {
export "$1"="$2"
}
. /users/some_user/.cshrc
答案 2 :(得分:1)
你能试试吗
file /users/some_user/.cshrc
确认文件是您认为的位置。 点运算符将执行该文件。
在.cshrc中放置一个echo语句将显示它已被运行。
请注意source
无法正常工作,因为它的 csh 而不是 ksh 脚本会让人感到困惑。
另外 read this
答案 3 :(得分: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
如前所述,您无法获取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