顯示具有 bash 標籤的文章。 顯示所有文章
顯示具有 bash 標籤的文章。 顯示所有文章

2013年5月12日 星期日

shell stdout/stderr redirect

# ls -l test.txt > test.err 2>&1

我實在受不了這是什麼了, 一次把它弄懂。
寫個程式來測試。

dir.c
1 #include <stdio.h>
2 
3 int main(int argc, char *argv[])
4 {
5   fprintf(stdout, "stdout\n");
6   fprintf(stderr, "stderr\n");
7   return 0;
8 }

test_result
 1 descent@w-linux:progs$ ./a.out 
 2 stdout
 3 stderr
 4 descent@w-linux:progs$ ./a.out 2> err
 5 stdout
 6 descent@w-linux:progs$ cat err 
 7 stderr
 8 descent@w-linux:progs$ ./a.out 1> out
 9 stderr
10 descent@w-linux:progs$ cat out 
11 stdout
12 descent@w-linux:progs$ ./a.out >& both
13 descent@w-linux:progs$ cat both 
14 stderr
15 stdout
16 descent@w-linux:progs$ ./a.out >  both 2>&1
17 descent@w-linux:progs$ cat both 
18 stderr
19 stdout
20 descent@w-linux:progs$ rm both 
21 descent@w-linux:progs$ ./a.out >  both 2>&1
22 descent@w-linux:progs$ cat both 
23 stderr
24 stdout

打完收工。
這樣清楚的寫法若你不習慣用
12 descent@w-linux:progs$ ./a.out >& both

> filea 將 stdout 轉到 filea
& filea 將 stderr 轉到 filea, 不過需配合 > 使用
清楚明瞭

還是要用這種寫法
16 descent@w-linux:progs$ ./a.out >  both 2>&1
那就照自己的習慣, 知道有另外的用法即可。

ref:

2012年1月5日 星期四

基本的 bash 語法

老是忘記, 寫一篇記起來:

  • while loop
  • i+=1
while [ $i -le 148 ];do
echo "file$i.jpg"
i=`expr $i + 1`
done

exit 0 # ok
exit 1 # something wrong

return (function 用的)

看 return value
echo $?

注意 = 左右的空白, 花了好多時間在上面。

g.sh
 1 #!/bin/sh
2
3 last=100
4 if [ "$1" != "" ]; then
5 last=$1
6 fi
7 echo $last
8
9 url=http://imgfast.manhua.178.com/l/%E9%9B%B6%E5%BA%A6%E6%88%98%E5%A7%AC/04/
10
11 i=1
12 while [ $i -le 9 ];do
13 echo "$url""0$i.jpg"
14 #wget "$url""00$i.jpg"
15 i=`expr $i + 1`
16 done

17
18 ll=99
19 if [ "$last" -le "99" ];then
20 ll=`expr $last`
21 fi
22
23 echo "ll: $ll"
24 echo "last: $last"
25
26 i=10
27 #while [ $i -le 103 ];do
28 while [ $i -le $ll ];do
29 echo "$url""$i.jpg"
30 #wget "$url""0$i.jpg"
31 i=`expr $i + 1`
32 done

33
34 if [ $last -le 99 ];then
35 i=100
36 else
37 i=100
38 while [ $i -le $last ];do
39 echo "$url""$i.jpg"
40 #wget "$url""0$i.jpg"
41 i=`expr $i + 1`
42 done
43 fi