我正在编写一个 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打印当前工作目录;使用大于 (>; >=) 和小于 (<; <=) 运算符可以更好地测试数字;\!$
表示命令的最后一个参数。