将 bash 函数转换为 csh 别名时出错

将 bash 函数转换为 csh 别名时出错

我正在编写一个 csh 别名,以便可以在 csh 中使用以下 bash 函数:

function up( )
{
    LIMIT=$1
    P=$PWD
    for ((i=1; i <= LIMIT; i++))
    do
        P=$P/..
    done
    cd $P
    export MPWD=$P
}

(我从以下地方窃取了上面的 bash 函数这里

我写过这个:

alias up 'set LIMIT=$1; set P=$PWD; set counter = LIMIT;  while[counter!=0] set counter = counter-1; P=$P/.. ; end cd $P; setenv MPWD=$P'

但是,我收到以下错误:

while[counter!=0]: No match.
P=/net/devstorage/home/rghosh/..: Command not found.
end: Too many arguments.

我的脚本没有按预期工作。我一直在阅读csh这里

答案1

我不确定是否可以while在一行上完成一个循环。但有几个可修复的错误:

  • while[counter!=0]应该是while ($counter != 1) (注意“ ”前后的空格!=)。
  • set counter = counter-1应该是@ counter = $counter – 1 (注意“ ”前后的空格)。
  • P=$P/..应该是set P=$P/..–– 或更好,set P="$P/.."(如果$P包含空格。
  • 这让我想起,set P=$PWD应该是set P="$PWD"cd $P应该是cd "$P"setenv MPWD=$P应该是setenv MPWD="$P",都是出于同样的原因。
  • 而且,如果您确实设法使while循环全部在一行上工作,那么您可能需要;end.

答案2

对于多行代码,别名必须位于单引号内,并且每行末尾必须前面有一个反斜杠。最后一行的结尾必须位于单引号之前以分隔别名的结尾:

alias up 'set counter = \!$\
set p = "$cwd"\
while ( $counter >= 1 )\
@ counter = $counter - 1\
set p = "$p/.."\
end\
cd "$p"\
setenv mpwd "$p"'

如果命令编辑器/历史记录出现问题,请添加kill -INT $$到别名的末尾。

顺便说一句,设置的变量set最好用等号将变量名和内容分开;setenv不需要等号;数学功能由@;提供控制结构使用括号;使用$cwd打印当前工作目录;使用大于 (>; >=) 和小于 (<; <=) 运算符可以更好地测试数字;\!$表示命令的最后一个参数。

相关内容