有时我在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)。
我该怎么办?
答案 0 :(得分:4)
此方法对我有用:
printf 'foreach f ( 1 2 3 )\n echo $f \n end' | tcsh
答案 1 :(得分:1)
在tcsh下,没有简单的方法可以在一行中执行foreach。
但是,通过使用别名,您可能会得到与您的问题非常接近的内容。
SSRS
您可以在终端中拨打alias disp 'foreach i (*.txt)\
cat $i\
end'
。
如果要将结果导入管道,请disp
。
有时,在进一步处理之前,我们需要先保存结果:echo `disp` | grep foobar
答案 2 :(得分:0)
我试图找到答案,但看起来没有办法。只需更改shell即可使用bash。
%bash
$ for f in * txt;回声$ f;完成
$ exit
%
答案 3 :(得分:0)
使用bash -c:
$ bash -c'for i in * .txt;做猫我;完成“
答案 4 :(得分:-1)
关于你的第一个问题,我不知道如何直接在.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表示文件扩展名)