文件类型
http://www.techrepublic.com/article/unix-permissions-made-easy/
命令行小技巧
ls npm bin
命令行同样支持模板字符串
shell 脚本知识——重定向符号
内置的文件描述符如下
1 => stdout
2 => stderr
0 => stdin
文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。>&1
中的&
表示文件描述符,如果没有&
则表示一个叫做1
的普通文件(regular file)
cmd > file
把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件。
如: echo "hello world" > index.html 将字符串写入到该文件中
cmd >> file
把cmd命令的输出以追加的方式重定向到文件file中,如果file已经存在,则把信息加在原有文件後面。
cmd < file
使cmd命令从file读入
cmd << tag
将开始标记 tag 和结束标记 tag 之间的内容作为输入。(所以一般会在内容末尾增加一个结束标记定界符 delimiter,比如 EOF)
注意:结尾的 delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
参考:非常系统清晰的重定向文档
多行文件的输入
#!/bin/sh
(
cat <<EOF
start()
{
echo "start"
}
EOF
) > /tmp/b
管道 pipeline
所以每一个进程的输出 stdout 被直接作为下一个进程的输入stdin
"pipeline" VS "and operator"
mkdir test | cd test
会报错 cd: no such file or directory: test
,就是因为 mkdir 是异步操作。管道传递的是上个命令的输出结果,这个输出结果是同步执行的,但是 cd 命令执行的时候文件夹实际上并没有创建。此时正确的就是利用 and operator:mkdir test && cd test
git diff index.html|cat
这样就是可以的,看到上个命令的输出结果并打印到终端上。
subshell 的概念
(https://unix.stackexchange.com/questions/323085/what-is-the-difference-between-and-in-bash-script)
另外,在(cd ~ && pwd)
是命令组,会开启一个 subshell 顺序执行cd~
在 subshell 中进行。而cd ~ && pwd
则直接在本 shell 中进行,会真正转到相应位置。
而用了管道之后(cd ~ | pwd)
,除了命令组的影响,还会多开启一个 subshell 来运行 cd~
小括号,中括号,大括号
单小括号
命令替换:(cmd) 等同于 `cmd`
还有各种双括号的玩法:http://blog.csdn.net/tttyd/article/details/11742241
字符串截取
http://www.cnblogs.com/wangbin/archive/2011/10/11/2207179.html