有时我对 csh 中的不同目标文件使用相同的 foreach 操作。
如果我可以在一行中给出 foreach 命令,我可以轻松地替换目标文件名来重复该过程。(我通常使用 `find . -name ...` 作为目标文件)
出于此问题的目的,我们假设我想捕获所有 *.txt 文件。
$ foreach i (*.txt)
foreach? cat $i
foreach? end
我读了https://unix.stackexchange.com/questions/32873/running-a-full-foreach-command并尝试了
alias disp 'echo "foreach i (*.txt)"; echo "cat "\$"i"; echo "end"; | /bin/csh'
当我输入
disp
时,它会给我 Invalid null command
。!foreach:gs/\.c\>/.h/
(做同样的事情,用 .h 替换 .c)。
我该怎么办?
这个方法对我有用:
printf 'foreach f ( 1 2 3 )\n echo $f \n end' | tcsh
在 tcsh 下没有简单的方法可以在一行中执行 foreach。
但是,通过使用别名,您可能会得到非常接近您的问题的内容。
alias disp 'foreach i (*.txt)\
cat $i\
end'
您可以在终端中拨打
disp
。
如果您想将结果导入管道,那么
echo `disp` | grep foobar
。
有时,我们需要先保存结果,然后再进行进一步处理:
set foo=`disp`
使用 bash -c:
$ bash -c 'for i in *.txt;做猫 $i;完成'
别名可以作为解决方法,但可能会很痛苦且受到限制。更喜欢创建脚本或 FIFO 文件。这是文件示例。
echo '\
# Functions\
alias function '\''( set argv = ( \\\!* ) ; source ~/.cshfuncs )'\' >> ~/.cshrc
echo 'switch ("$1")\
case 'disp':\
shift\
foreach i (*.txt)\
cat "$i"\
end\
exit\
default:\
echo "Function $1 not set."\
exit\
endsw' > ~/.cshfuncs
这是 FIFO 的示例。
mkfifo ~/fifo
echo 'foreach i (*.txt)\
cat "$i"\
end' > ~/fifo & ( source ~/fifo )
对于你的第一个问题,我不知道如何直接在.cshrc文件中编写它。
但我会用另一种灵活的方式来做到这一点。
1:编写shell脚本: /home/user/disp.sh(或任何你想要的路径)
#/bin/bash
for line in `find . -name "*.c"`; do
echo ""
cat "$line"
done
或者你只有 csh shell:
#/bin/csh
foreach i (*.c)
echo $i
end
将新的别名命令添加到
.cshrc
文件
alias disp /home/user/disp.sh
重新进入csh shell(或重新登录)
csh
对于你的第二个问题,我是在同一个 disp.sh 脚本上完成的
这个例子是用bash shell脚本编写的。
#/bin/bash
usage() { echo "Usage: $0 [-d <depth>] [-e <extension>]" 1>&2; exit 1; }
while getopts ":d:e:" o; do
case "${o}" in
d)
d=${OPTARG}
;;
e)
e=${OPTARG}
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
if [ -z "${d}" ] || [ -z "${e}" ]; then
usage
fi
for line in `find . -maxdepth ${d} -name "*.${e}"`; do
echo ""
cat "$line"
done
您只需输入
disp -d 1 -e c
即可查找当前路径中的所有.c文件。
(-d表示从当前路径开始的文件深度,-e表示文件扩展名)
我试图寻找答案,但看起来没有办法。只需更改 shell 即可使用 bash。
%重击
$ 代表 *txt 中的 f;做回声 $f;完成
$退出
%