2.IO

  1. echo
  2. printf (placeholder string)
  3. cat
  4. tee
  5. Arrow 箭头
    1. Redirecting Output 重定向输出
      1. Override 覆盖 >
      2. Append 追加 >>
    2. Process substitution <()< <()
    3. Here Documents <<
    4. Here Strings <<<
    5. 异常流和正常流
  6. read
  7. 特殊场景

echoprintcattee 等IO相关的命令的笔记。

echo

echo - display a line of text

1
2
3
4
# 打印变量
echo "$PATH"
# 不打印变量
echo '$PATH'

printf (placeholder string)

Formats and prints ARGUMENTS under control of the FORMAT. 调整格式

1
2
3
# 打印 withou newline
$  printf xxx
xxx $
1
2
3
4
5
6
# 调整格式
$ printf '%s\n%s\n' "str1" "str2"
str1
str2
$ printf "%20s %d\n" "xxx"
      xxx

cat

Concatenate FILE(s) to standard output.

1
$ cat ${file_1} ${file_2}

tee

Copy standard input to each FILE, and also to standard output. 输出正常流到文件,并但因错误信息。

输出并覆盖文件:

1
$ 标准输出 | tee ${文件名}

打印并追加文件:

1
$ 标准输出 | tee --append  ${文件名}

同时操作多个文件:

1
2
$ 标准输出 | tee --append  ${文件名-a} ${文件名-b}
# echo test | tee - a fileA.txt fileb.txt

当出现错误*信息:

1
2
3
4
5
6
$ ls ./null.txt | tee ./haha
ls: cannot access './null.txt': No such file or directory
$ echo $?
0
$ cat ./haha

保存错误信息:

1
2
3
4
$ ls ./null.txt 2>&1 | tee ./error
ls: cannot access './null.txt': No such file or directory
$ cat ./error 
ls: cannot access './null.txt': No such file or directory

Arrow 箭头

参考 man bashRedirecting OutputAppending Redirected Output

Redirecting Output 重定向输出

Override 覆盖 >

将文件内容覆盖到指定文件:

1
2
3
cat << EOF > 文件路径
# 文件内容
EOF

Append 追加 >>

将文件内容追加到指定文件:

1
2
3
cat << EOF >> 文件路径
# 文件内容
EOF

Process substitution <()< <()

执行 <(commnad) 后,将产生一个文件路径。每一个 <(commnad) 都会产生一个新的路径

1
2
3
4
$ echo <(date)
/dev/fd/63
$ echo <(date) <(date) <(date)
/dev/fd/63 /dev/fd/62 /dev/fd/61

<(commnad) 中的 command 产生的结果将会存储到上述的文件里

1
2
3
4
5
6
7
# 从 /dev/fd/63 里获得 date
$ cat <(date) 
2021年  5月 18日 火曜日 22:45:11 JST
# 存储了两次到 /dev/fd/63 里
$ cat <(date) <(date)
2021年  5月 18日 火曜日 22:45:11 JST
2021年  5月 18日 火曜日 22:45:11 JST

< <() 实质等同于 < + <() ,实质等同于下列

1
2
3
4
5
6
7
8
$ temp_file=$(mktemp)
$ echo "hello world" > $temp_file
$ cat < $temp_file
hello world

# 等同于
$ cat < <(echo "hello world")
hello world

>()

1
2
3
4
5
6
7
8
9
$ echo "/home/$USER" > >(cat)
# 等同于
$ temp_file=$(mktemp)
$ echo "/home/$USER" > $(mktemp)
$ cat $(mktemp)


# 其他示例
$ echo "/home/$USER" > >(xargs ls -l)

参考:Process Substitution

Here Documents <<

1
2
3
4
5
read a b << EOF 
hello word
EOF
echo $a # hello
echo $b # word

Here Strings <<<

1
2
3
4
5
6
7
read a b << EOF 
hello word
EOF
# 等同于
read a b <<< "hello world" 
echo $a # hello
echo $b # word

异常流和正常流

1
2
3
4
5
6
7
8
9
10
11
12
13
# 分别保存异常和正常信息
command > ${正常信息存储文件} 2>${错误信息存储文件}

# 保存正常与异常信息至 同一 文件
command &> ${正常+错误信息的存储文件}

# 保存正常信息,打印错误信息
command >${正常信息存储文件} 2>&1

# 丢失正常信息和错误信息
# 正常流被丢弃,异常流导向正常流,y
command >/dev/null 2>&1
= command &>/dev/null
  • https://askubuntu.com/questions/625224/how-to-redirect-stderr-to-a-file

read

普通用法

1
2
3
4
5
6
7
8
# 1
echo "hello world" | { read x y; echo $x ; echo $y ;}

#2
while read line; do echo $line; done < ${temp_file}

#3
while read line; do echo $line; done < <(echo "hello world")

read -r 不允许 \ 发挥作用。

-r do not allow backslashes to escape any characters

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
temp_file=$(mktemp)

cat << EOF > ${temp_file}
ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMs\
Ni3EAX1qvogWpRIPE3oagJL6nwl\QQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\\\\\\\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXax\n
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQ\n\n\n
EnO04N1nEkpWbfXRxrtYNqCZDpF\trQIXS
EOF

$ while read line; do echo $line; done < ${temp_file}
ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMsNi3EAX1qvogWpRIPE3oagJL6nwlQQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXaxn
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQnnn
EnO04N1nEkpWbfXRxrtYNqCZDpFtrQIXS

$ while read -r line; do echo $line; done < $temp_file
ngRTM6hNqgziZcqCcEJN7bHAP9a1GeMsNi3EAX1qvogWpRIPE3oagJL6nwl\QQW9y
bjJHyaVBrUcyZOY5U4h9QHnpEPqg\\\\\Q9Fk
iNOvAyBTAcN5n1uwR4GvRfAGUbPWiXax\n
cqGPPStH3gaWolrfVAlMtoWiSuLa7GzQ\n\n\n
EnO04N1nEkpWbfXRxrtYNqCZDpF\trQIXS

特殊场景