| 知乎专栏 |
2009-11-15
电子书最近一次更新于 2026-08-05 15:33:47
版权 © 2009-2026 Neo Chan
版权声明
转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。
|
|
内容摘要
Netkiller 系列手札 已经被 Github 收录,并备份保存在北极地下250米深的代码库中,备份会保留1000年。
我的系列文档:
| Netkiller Linux 手札 | Netkiller FreeBSD 手札 | Netkiller Shell 手札 | Netkiller Security 手札 |
| Netkiller Web 手札 | Netkiller Monitoring 手札 | Netkiller Storage 手札 | Netkiller Mail 手札 |
| Netkiller Virtualization 手札 | Netkiller Cryptography 手札 |
以下文档停止更新合并到 《Netkiller Linux 手札》
| Netkiller Debian 手札 | Netkiller CentOS 手札 | Netkiller Multimedia 手札 |
|
Netkiller 系列手札 已经被 Github 收录,并备份保存在北极地下250米深的代码库中,备份会保留1000年。 Preserving open source software for future generations The world is powered by open source software. It is a hidden cornerstone of modern civilization, and the shared heritage of all humanity. The GitHub Arctic Code Vault is a data repository preserved in the Arctic World Archive (AWA), a very-long-term archival facility 250 meters deep in the permafrost of an Arctic mountain. We are collaborating with the Bodleian Library in Oxford, the Bibliotheca Alexandrina in Egypt, and Stanford Libraries in California to store copies of 17,000 of GitHub’s most popular and most-depended-upon projects—open source’s “greatest hits”—in their archives, in museum-quality cases, to preserve them for future generations. |
目录
表格清单
范例清单
$ getconf LONG_BIT 32 $ getconf WORD_BIT 32
LINK_MAX 65000 _POSIX_LINK_MAX 65000 MAX_CANON 255 _POSIX_MAX_CANON 255 MAX_INPUT 255 _POSIX_MAX_INPUT 255 NAME_MAX 255 _POSIX_NAME_MAX 255 PATH_MAX 4096 _POSIX_PATH_MAX 4096 PIPE_BUF 4096 _POSIX_PIPE_BUF 4096 SOCK_MAXBUF _POSIX_ASYNC_IO _POSIX_CHOWN_RESTRICTED 1 _POSIX_NO_TRUNC 1 _POSIX_PRIO_IO _POSIX_SYNC_IO _POSIX_VDISABLE 0 ARG_MAX 2097152 ATEXIT_MAX 2147483647 CHAR_BIT 8 CHAR_MAX 127 CHAR_MIN -128 CHILD_MAX 63918 CLK_TCK 100 INT_MAX 2147483647 INT_MIN -2147483648 IOV_MAX 1024 LOGNAME_MAX 256 LONG_BIT 64 MB_LEN_MAX 16 NGROUPS_MAX 65536 NL_ARGMAX 4096 NL_LANGMAX 2048 NL_MSGMAX 2147483647 NL_NMAX 2147483647 NL_SETMAX 2147483647 NL_TEXTMAX 2147483647 NSS_BUFLEN_GROUP 1024 NSS_BUFLEN_PASSWD 1024 NZERO 20 OPEN_MAX 1024 PAGESIZE 4096 PAGE_SIZE 4096 PASS_MAX 8192 PTHREAD_DESTRUCTOR_ITERATIONS 4 PTHREAD_KEYS_MAX 1024 PTHREAD_STACK_MIN 16384 PTHREAD_THREADS_MAX SCHAR_MAX 127 SCHAR_MIN -128 SHRT_MAX 32767 SHRT_MIN -32768 SSIZE_MAX 32767 TTY_NAME_MAX 32 TZNAME_MAX UCHAR_MAX 255 UINT_MAX 4294967295 UIO_MAXIOV 1024 ULONG_MAX 18446744073709551615 USHRT_MAX 65535 WORD_BIT 32 _AVPHYS_PAGES 972844 _NPROCESSORS_CONF 8 _NPROCESSORS_ONLN 8 _PHYS_PAGES 4106156 _POSIX_ARG_MAX 2097152 _POSIX_ASYNCHRONOUS_IO 200809 _POSIX_CHILD_MAX 63918 _POSIX_FSYNC 200809 _POSIX_JOB_CONTROL 1 _POSIX_MAPPED_FILES 200809 _POSIX_MEMLOCK 200809 _POSIX_MEMLOCK_RANGE 200809 _POSIX_MEMORY_PROTECTION 200809 _POSIX_MESSAGE_PASSING 200809 _POSIX_NGROUPS_MAX 65536 _POSIX_OPEN_MAX 1024 _POSIX_PII _POSIX_PII_INTERNET _POSIX_PII_INTERNET_DGRAM _POSIX_PII_INTERNET_STREAM _POSIX_PII_OSI _POSIX_PII_OSI_CLTS _POSIX_PII_OSI_COTS _POSIX_PII_OSI_M _POSIX_PII_SOCKET _POSIX_PII_XTI _POSIX_POLL _POSIX_PRIORITIZED_IO 200809 _POSIX_PRIORITY_SCHEDULING 200809 _POSIX_REALTIME_SIGNALS 200809 _POSIX_SAVED_IDS 1 _POSIX_SELECT _POSIX_SEMAPHORES 200809 _POSIX_SHARED_MEMORY_OBJECTS 200809 _POSIX_SSIZE_MAX 32767 _POSIX_STREAM_MAX 16 _POSIX_SYNCHRONIZED_IO 200809 _POSIX_THREADS 200809 _POSIX_THREAD_ATTR_STACKADDR 200809 _POSIX_THREAD_ATTR_STACKSIZE 200809 _POSIX_THREAD_PRIORITY_SCHEDULING 200809 _POSIX_THREAD_PRIO_INHERIT 200809 _POSIX_THREAD_PRIO_PROTECT 200809 _POSIX_THREAD_ROBUST_PRIO_INHERIT _POSIX_THREAD_ROBUST_PRIO_PROTECT _POSIX_THREAD_PROCESS_SHARED 200809 _POSIX_THREAD_SAFE_FUNCTIONS 200809 _POSIX_TIMERS 200809 TIMER_MAX _POSIX_TZNAME_MAX _POSIX_VERSION 200809 _T_IOV_MAX _XOPEN_CRYPT _XOPEN_ENH_I18N 1 _XOPEN_LEGACY 1 _XOPEN_REALTIME 1 _XOPEN_REALTIME_THREADS 1 _XOPEN_SHM 1 _XOPEN_UNIX 1 _XOPEN_VERSION 700 _XOPEN_XCU_VERSION 4 _XOPEN_XPG2 1 _XOPEN_XPG3 1 _XOPEN_XPG4 1 BC_BASE_MAX 99 BC_DIM_MAX 2048 BC_SCALE_MAX 99 BC_STRING_MAX 1000 CHARCLASS_NAME_MAX 2048 COLL_WEIGHTS_MAX 255 EQUIV_CLASS_MAX EXPR_NEST_MAX 32 LINE_MAX 2048 POSIX2_BC_BASE_MAX 99 POSIX2_BC_DIM_MAX 2048 POSIX2_BC_SCALE_MAX 99 POSIX2_BC_STRING_MAX 1000 POSIX2_CHAR_TERM 200809 POSIX2_COLL_WEIGHTS_MAX 255 POSIX2_C_BIND 200809 POSIX2_C_DEV 200809 POSIX2_C_VERSION 200809 POSIX2_EXPR_NEST_MAX 32 POSIX2_FORT_DEV POSIX2_FORT_RUN _POSIX2_LINE_MAX 2048 POSIX2_LINE_MAX 2048 POSIX2_LOCALEDEF 200809 POSIX2_RE_DUP_MAX 32767 POSIX2_SW_DEV 200809 POSIX2_UPE POSIX2_VERSION 200809 RE_DUP_MAX 32767 PATH /bin:/usr/bin CS_PATH /bin:/usr/bin LFS_CFLAGS LFS_LDFLAGS LFS_LIBS LFS_LINTFLAGS LFS64_CFLAGS -D_LARGEFILE64_SOURCE LFS64_LDFLAGS LFS64_LIBS LFS64_LINTFLAGS -D_LARGEFILE64_SOURCE _XBS5_WIDTH_RESTRICTED_ENVS XBS5_LP64_OFF64 XBS5_WIDTH_RESTRICTED_ENVS XBS5_LP64_OFF64 _XBS5_ILP32_OFF32 XBS5_ILP32_OFF32_CFLAGS XBS5_ILP32_OFF32_LDFLAGS XBS5_ILP32_OFF32_LIBS XBS5_ILP32_OFF32_LINTFLAGS _XBS5_ILP32_OFFBIG XBS5_ILP32_OFFBIG_CFLAGS XBS5_ILP32_OFFBIG_LDFLAGS XBS5_ILP32_OFFBIG_LIBS XBS5_ILP32_OFFBIG_LINTFLAGS _XBS5_LP64_OFF64 1 XBS5_LP64_OFF64_CFLAGS -m64 XBS5_LP64_OFF64_LDFLAGS -m64 XBS5_LP64_OFF64_LIBS XBS5_LP64_OFF64_LINTFLAGS _XBS5_LPBIG_OFFBIG XBS5_LPBIG_OFFBIG_CFLAGS XBS5_LPBIG_OFFBIG_LDFLAGS XBS5_LPBIG_OFFBIG_LIBS XBS5_LPBIG_OFFBIG_LINTFLAGS _POSIX_V6_ILP32_OFF32 POSIX_V6_ILP32_OFF32_CFLAGS POSIX_V6_ILP32_OFF32_LDFLAGS POSIX_V6_ILP32_OFF32_LIBS POSIX_V6_ILP32_OFF32_LINTFLAGS _POSIX_V6_WIDTH_RESTRICTED_ENVS POSIX_V6_LP64_OFF64 POSIX_V6_WIDTH_RESTRICTED_ENVS POSIX_V6_LP64_OFF64 _POSIX_V6_ILP32_OFFBIG POSIX_V6_ILP32_OFFBIG_CFLAGS POSIX_V6_ILP32_OFFBIG_LDFLAGS POSIX_V6_ILP32_OFFBIG_LIBS POSIX_V6_ILP32_OFFBIG_LINTFLAGS _POSIX_V6_LP64_OFF64 1 POSIX_V6_LP64_OFF64_CFLAGS -m64 POSIX_V6_LP64_OFF64_LDFLAGS -m64 POSIX_V6_LP64_OFF64_LIBS POSIX_V6_LP64_OFF64_LINTFLAGS _POSIX_V6_LPBIG_OFFBIG POSIX_V6_LPBIG_OFFBIG_CFLAGS POSIX_V6_LPBIG_OFFBIG_LDFLAGS POSIX_V6_LPBIG_OFFBIG_LIBS POSIX_V6_LPBIG_OFFBIG_LINTFLAGS _POSIX_V7_ILP32_OFF32 POSIX_V7_ILP32_OFF32_CFLAGS POSIX_V7_ILP32_OFF32_LDFLAGS POSIX_V7_ILP32_OFF32_LIBS POSIX_V7_ILP32_OFF32_LINTFLAGS _POSIX_V7_WIDTH_RESTRICTED_ENVS POSIX_V7_LP64_OFF64 POSIX_V7_WIDTH_RESTRICTED_ENVS POSIX_V7_LP64_OFF64 _POSIX_V7_ILP32_OFFBIG POSIX_V7_ILP32_OFFBIG_CFLAGS POSIX_V7_ILP32_OFFBIG_LDFLAGS POSIX_V7_ILP32_OFFBIG_LIBS POSIX_V7_ILP32_OFFBIG_LINTFLAGS _POSIX_V7_LP64_OFF64 1 POSIX_V7_LP64_OFF64_CFLAGS -m64 POSIX_V7_LP64_OFF64_LDFLAGS -m64 POSIX_V7_LP64_OFF64_LIBS POSIX_V7_LP64_OFF64_LINTFLAGS _POSIX_V7_LPBIG_OFFBIG POSIX_V7_LPBIG_OFFBIG_CFLAGS POSIX_V7_LPBIG_OFFBIG_LDFLAGS POSIX_V7_LPBIG_OFFBIG_LIBS POSIX_V7_LPBIG_OFFBIG_LINTFLAGS _POSIX_ADVISORY_INFO 200809 _POSIX_BARRIERS 200809 _POSIX_BASE _POSIX_C_LANG_SUPPORT _POSIX_C_LANG_SUPPORT_R _POSIX_CLOCK_SELECTION 200809 _POSIX_CPUTIME 200809 _POSIX_THREAD_CPUTIME 200809 _POSIX_DEVICE_SPECIFIC _POSIX_DEVICE_SPECIFIC_R _POSIX_FD_MGMT _POSIX_FIFO _POSIX_PIPE _POSIX_FILE_ATTRIBUTES _POSIX_FILE_LOCKING _POSIX_FILE_SYSTEM _POSIX_MONOTONIC_CLOCK 200809 _POSIX_MULTI_PROCESS _POSIX_SINGLE_PROCESS _POSIX_NETWORKING _POSIX_READER_WRITER_LOCKS 200809 _POSIX_SPIN_LOCKS 200809 _POSIX_REGEXP 1 _REGEX_VERSION _POSIX_SHELL 1 _POSIX_SIGNALS _POSIX_SPAWN 200809 _POSIX_SPORADIC_SERVER _POSIX_THREAD_SPORADIC_SERVER _POSIX_SYSTEM_DATABASE _POSIX_SYSTEM_DATABASE_R _POSIX_TIMEOUTS 200809 _POSIX_TYPED_MEMORY_OBJECTS _POSIX_USER_GROUPS _POSIX_USER_GROUPS_R POSIX2_PBS POSIX2_PBS_ACCOUNTING POSIX2_PBS_LOCATE POSIX2_PBS_TRACK POSIX2_PBS_MESSAGE SYMLOOP_MAX STREAM_MAX 16 AIO_LISTIO_MAX AIO_MAX AIO_PRIO_DELTA_MAX 20 DELAYTIMER_MAX 2147483647 HOST_NAME_MAX 64 LOGIN_NAME_MAX 256 MQ_OPEN_MAX MQ_PRIO_MAX 32768 _POSIX_DEVICE_IO _POSIX_TRACE _POSIX_TRACE_EVENT_FILTER _POSIX_TRACE_INHERIT _POSIX_TRACE_LOG RTSIG_MAX 32 SEM_NSEMS_MAX SEM_VALUE_MAX 2147483647 SIGQUEUE_MAX 63918 FILESIZEBITS 64 POSIX_ALLOC_SIZE_MIN 4096 POSIX_REC_INCR_XFER_SIZE POSIX_REC_MAX_XFER_SIZE POSIX_REC_MIN_XFER_SIZE 4096 POSIX_REC_XFER_ALIGN 4096 SYMLINK_MAX GNU_LIBC_VERSION glibc 2.28 GNU_LIBPTHREAD_VERSION NPTL 2.28 POSIX2_SYMLINKS 1 LEVEL1_ICACHE_SIZE 65536 LEVEL1_ICACHE_ASSOC 2 LEVEL1_ICACHE_LINESIZE 64 LEVEL1_DCACHE_SIZE 65536 LEVEL1_DCACHE_ASSOC 2 LEVEL1_DCACHE_LINESIZE 64 LEVEL2_CACHE_SIZE 524288 LEVEL2_CACHE_ASSOC 16 LEVEL2_CACHE_LINESIZE 64 LEVEL3_CACHE_SIZE 16777216 LEVEL3_CACHE_ASSOC 16 LEVEL3_CACHE_LINESIZE 64 LEVEL4_CACHE_SIZE 0 LEVEL4_CACHE_ASSOC 0 LEVEL4_CACHE_LINESIZE 0 IPV6 200809 RAW_SOCKETS 200809 _POSIX_IPV6 200809 _POSIX_RAW_SOCKETS 200809
Ctrl+p shell中上一个命令,或者 文本中移动到上一行 Ctrl+n shell中下一个命令,或者 文本中移动到下一行 Ctrl+r 往后搜索历史命令 Ctrl+s 往前搜索历史命令 Ctrl+f 光标前移 Ctrl+b 光标后退 Ctrl+a 到行首 Ctrl+e 到行尾 Ctrl+d 删除一个字符,删除一个字符,相当于通常的Delete键 Ctrl+h 退格删除一个字符,相当于通常的Backspace键 Ctrl+u 删除到行首 Ctrl+k 删除到行尾 Ctrl+l 类似 clear 命令效果 Ctrl+y 粘贴
Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按字符前移(右向) Ctrl + b :按字符后移(左向) Alt + f :按单词前移(右向) Alt + b :按单词后移(左向) Ctrl + xx:在命令行首和光标之间移动 Ctrl + u :从光标处删除至命令行首 Ctrl + k :从光标处删除至命令行尾 Ctrl + w :从光标处删除至字首 Alt + d :从光标处删除至字尾 Ctrl + d :删除光标处的字符 Ctrl + h :删除光标前的字符 Ctrl + y :粘贴至光标后 Alt + c :从光标处更改为首字母大写的单词 Alt + u :从光标处更改为全部大写的单词 Alt + l :从光标处更改为全部小写的单词 Ctrl + t :交换光标处和之前的字符 Alt + t :交换光标处和之前的单词 Alt + Backspace:与 Ctrl + w 相同类似,分隔符有些差别
Ctrl + r:逆向搜索命令历史 Ctrl + g:从历史搜索模式退出 Ctrl + p:历史中的上一条命令 Ctrl + n:历史中的下一条命令 Alt + .:使用上一条命令的最后一个参数
Ctrl + l:清屏 Ctrl + o:执行当前命令,并选择上一条命令 Ctrl + s:阻止屏幕输出 Ctrl + q:允许屏幕输出 Ctrl + c:终止命令 Ctrl + z:挂起命令
!!:执行上一条命令 !blah:执行最近的以 blah 开头的命令,如 !ls !blah:p:仅打印输出,而不执行 !$:上一条命令的最后一个参数,与 Alt + . 相同 !$:p:打印输出 !$ 的内容 !*:上一条命令的所有参数 !*:p:打印输出 !* 的内容 ^neo:删除上一条命令中的 neo ^neo^foo:将上一条命令中的 neo 替换为 foo ^neo^foo^:将上一条命令中所有的 neo 都替换为 foo
^ 是 bash/zsh 用法,在 fish 中不能使用
[root@netkiller ~]# ls /bin [root@netkiller ~]# ^ls^ll ll /bin lrwxrwxrwx. 1 root root 7 2022-05-16 20:28 /bin -> usr/bin [root@netkiller ~]#
# chsh --list /bin/sh /bin/bash /sbin/nologin /bin/tcsh /bin/csh /bin/ksh # chsh --list-shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/zsh
$ chsh -s /bin/zsh or $ usermod -s /bin/zsh
show me current shell
neo@netkiller:~$ echo $SHELL /bin/zsh neo@netkiller:~$ cat /etc/passwd|grep neo neo:x:1000:1000:Neo Chen,,,:/home/neo:/bin/zsh
"OS error code 1: Operation not permitted" "OS error code 2: No such file or directory" "OS error code 3: No such process" "OS error code 4: Interrupted system call" "OS error code 5: Input/output error" "OS error code 6: No such device or address" "OS error code 7: Argument list too long" "OS error code 8: Exec format error" "OS error code 9: Bad file descriptor" "OS error code 10: No child processes" "OS error code 11: Resource temporarily unavailable" "OS error code 12: Cannot allocate memory" "OS error code 13: Permission denied" "OS error code 14: Bad address" "OS error code 15: Block device required" "OS error code 16: Device or resource busy" "OS error code 17: File exists" "OS error code 18: Invalid cross-device link" "OS error code 19: No such device" "OS error code 20: Not a directory" "OS error code 21: Is a directory" "OS error code 22: Invalid argument" "OS error code 23: Too many open files in system" "OS error code 24: Too many open files" "OS error code 25: Inappropriate ioctl for device" "OS error code 26: Text file busy" "OS error code 27: File too large" "OS error code 28: No space left on device" "OS error code 29: Illegal seek" "OS error code 30: Read-only file system" "OS error code 31: Too many links" "OS error code 32: Broken pipe" "OS error code 33: Numerical argument out of domain" "OS error code 34: Numerical result out of range" "OS error code 35: Resource deadlock avoided" "OS error code 36: File name too long" "OS error code 37: No locks available" "OS error code 38: Function not implemented" "OS error code 39: Directory not empty" "OS error code 40: Too many levels of symbolic links" "OS error code 42: No message of desired type" "OS error code 43: Identifier removed" "OS error code 44: Channel number out of range" "OS error code 45: Level 2 not synchronized" "OS error code 46: Level 3 halted" "OS error code 47: Level 3 reset" "OS error code 48: Link number out of range" "OS error code 49: Protocol driver not attached" "OS error code 50: No CSI structure available" "OS error code 51: Level 2 halted" "OS error code 52: Invalid exchange" "OS error code 53: Invalid request descriptor" "OS error code 54: Exchange full" "OS error code 55: No anode" "OS error code 56: Invalid request code" "OS error code 57: Invalid slot" "OS error code 59: Bad font file format" "OS error code 60: Device not a stream" "OS error code 61: No data available" "OS error code 62: Timer expired" "OS error code 63: Out of streams resources" "OS error code 64: Machine is not on the network" "OS error code 65: Package not installed" "OS error code 66: Object is remote" "OS error code 67: Link has been severed" "OS error code 68: Advertise error" "OS error code 69: Srmount error" "OS error code 70: Communication error on send" "OS error code 71: Protocol error" "OS error code 72: Multihop attempted" "OS error code 73: RFS specific error" "OS error code 74: Bad message" "OS error code 75: Value too large for defined data type" "OS error code 76: Name not unique on network" "OS error code 77: File descriptor in bad state" "OS error code 78: Remote address changed" "OS error code 79: Can not access a needed shared library" "OS error code 80: Accessing a corrupted shared library" "OS error code 81: .lib section in a.out corrupted" "OS error code 82: Attempting to link in too many shared libraries" "OS error code 83: Cannot exec a shared library directly" "OS error code 84: Invalid or incomplete multibyte or wide character" "OS error code 85: Interrupted system call should be restarted" "OS error code 86: Streams pipe error" "OS error code 87: Too many users" "OS error code 88: Socket operation on non-socket" "OS error code 89: Destination address required" "OS error code 90: Message too long" "OS error code 91: Protocol wrong type for socket" "OS error code 92: Protocol not available" "OS error code 93: Protocol not supported" "OS error code 94: Socket type not supported" "OS error code 95: Operation not supported" "OS error code 96: Protocol family not supported" "OS error code 97: Address family not supported by protocol" "OS error code 98: Address already in use" "OS error code 99: Cannot assign requested address" "OS error code 100: Network is down" "OS error code 101: Network is unreachable" "OS error code 102: Network dropped connection on reset" "OS error code 103: Software caused connection abort" "OS error code 104: Connection reset by peer" "OS error code 105: No buffer space available" "OS error code 106: Transport endpoint is already connected" "OS error code 107: Transport endpoint is not connected" "OS error code 108: Cannot send after transport endpoint shutdown" "OS error code 109: Too many references: cannot splice" "OS error code 110: Connection timed out" "OS error code 111: Connection refused" "OS error code 112: Host is down" "OS error code 113: No route to host" "OS error code 114: Operation already in progress" "OS error code 115: Operation now in progress" "OS error code 116: Stale NFS file handle" "OS error code 117: Structure needs cleaning" "OS error code 118: Not a XENIX named type file" "OS error code 119: No XENIX semaphores available" "OS error code 120: Is a named type file" "OS error code 121: Remote I/O error" "OS error code 122: Disk quota exceeded" "OS error code 123: No medium found" "OS error code 124: Wrong medium type" "OS error code 125: Operation canceled" "OS error code 126: Required key not available" "OS error code 127: Key has expired" "OS error code 128: Key has been revoked" "OS error code 129: Key was rejected by service" "OS error code 130: Owner died" "OS error code 131: State not recoverable"
http://ohmyz.sh/
Oh My ZSH 是z shell命令主题
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
neo@netkiller:~$ cat .zshrc
# Created by newuser for 4.3.9
PROMPT='%n@%M:%~$ '
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
eval "`dircolors -b`"
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
# Home/End/Del key
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
bindkey "\e[3~" delete-char
$ PROMPT='%n@%M:%~$ ' neo@netkiller:~$
autoload colors; colors
export PS1="%B[%{$fg[red]%}%n%{$reset_color%}%b@%B%{$fg[cyan]%}%m%b%{$reset_color%}:%~%B]%b "
[neo@netkiller:~/.oh-my-zsh/themes]
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
eval "`dircolors -b`"
alias ls='ls --color=auto'
alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
neo@MacBook-Pro-M2 ~> curl http://wttr.in/
Weather report: Shenzhen, China
\ / Partly cloudy
_ /"".-. 18 °C
\_( ). ↘ 26 km/h
/(___(__) 10 km
0.0 mm
┌─────────────┐
┌──────────────────────────────┬───────────────────────┤ Mon 09 Jan ├───────────────────────┬──────────────────────────────┐
│ Morning │ Noon └──────┬──────┘ Evening │ Night │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ Overcast │ Overcast │ Overcast │ Overcast │
│ .--. 17 °C │ .--. 21 °C │ .--. 19 °C │ .--. 18 °C │
│ .-( ). ↓ 7-9 km/h │ .-( ). ↙ 7-8 km/h │ .-( ). ↙ 7-10 km/h │ .-( ). ↙ 7-10 km/h │
│ (___.__)__) 10 km │ (___.__)__) 10 km │ (___.__)__) 10 km │ (___.__)__) 10 km │
│ 0.0 mm | 0% │ 0.0 mm | 0% │ 0.0 mm | 0% │ 0.0 mm | 0% │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
┌─────────────┐
┌──────────────────────────────┬───────────────────────┤ Tue 10 Jan ├───────────────────────┬──────────────────────────────┐
│ Morning │ Noon └──────┬──────┘ Evening │ Night │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ _`/"".-. Patchy rain po…│ _`/"".-. Patchy rain po…│ .-. Light drizzle │ Overcast │
│ ,\_( ). 17 °C │ ,\_( ). 18 °C │ ( ). 17 °C │ .--. 16 °C │
│ /(___(__) ↙ 6-9 km/h │ /(___(__) ↙ 8-9 km/h │ (___(__) ↙ 9-13 km/h │ .-( ). ↙ 7-10 km/h │
│ ‘ ‘ ‘ ‘ 10 km │ ‘ ‘ ‘ ‘ 10 km │ ‘ ‘ ‘ ‘ 2 km │ (___.__)__) 10 km │
│ ‘ ‘ ‘ ‘ 0.1 mm | 61% │ ‘ ‘ ‘ ‘ 0.1 mm | 81% │ ‘ ‘ ‘ ‘ 0.7 mm | 83% │ 0.0 mm | 0% │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
┌─────────────┐
┌──────────────────────────────┬───────────────────────┤ Wed 11 Jan ├───────────────────────┬──────────────────────────────┐
│ Morning │ Noon └──────┬──────┘ Evening │ Night │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│ _`/"".-. Patchy rain po…│ _`/"".-. Patchy rain po…│ \ / Partly cloudy │ \ / Partly cloudy │
│ ,\_( ). 16 °C │ ,\_( ). 17 °C │ _ /"".-. 18 °C │ _ /"".-. 17 °C │
│ /(___(__) ↙ 5-7 km/h │ /(___(__) ↙ 5-6 km/h │ \_( ). ↙ 7-9 km/h │ \_( ). ← 7-11 km/h │
│ ‘ ‘ ‘ ‘ 10 km │ ‘ ‘ ‘ ‘ 10 km │ /(___(__) 10 km │ /(___(__) 10 km │
│ ‘ ‘ ‘ ‘ 0.1 mm | 87% │ ‘ ‘ ‘ ‘ 0.1 mm | 84% │ 0.0 mm | 0% │ 0.0 mm | 0% │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
Follow @igor_chubin for wttr.in updates
test 命令用于条件判断,返回 0(真)或非 0(假)。在 shell 脚本中常用于 if、while 等控制结构。方括号 [ ] 是 test 命令的另一种写法。
test EXPRESSION [ EXPRESSION ] # 两种写法等价: test -f /etc/passwd [ -f /etc/passwd ]
注意:[ 和 EXPRESSION 以及 ] 之间必须有空格。
测试文件属性的常用操作符:
-e file - 文件存在
-f file - 文件存在且是普通文件
-d file - 文件存在且是目录
-r file - 文件存在且可读
-w file - 文件存在且可写
-x file - 文件存在且可执行
-s file - 文件存在且大小大于 0
-L file - 文件存在且是符号链接
-O file - 文件存在且属于当前用户
-G file - 文件存在且属于当前组
-N file - 文件存在且上次读取后被修改过
-c file - 文件存在且是字符特殊文件
-b file - 文件存在且是块特殊文件
-S file - 文件存在且是套接字
-p file - 文件存在且是命名管道
文件比较:
file1 -nt file2 - file1 比 file2 新(mtime)
file1 -ot file2 - file1 比 file2 旧
file1 -ef file2 - file1 和 file2 有相同的 device 和 inode
示例:
# 检查文件是否存在
test -f /etc/passwd && echo "文件存在"
# 检查目录是否存在
[ -d /var/log ] && echo "目录存在"
# 检查文件是否可执行
[ -x /usr/bin/munin-cron ] && /usr/bin/munin-cron
# 检查文件是否为空
if [ ! -s /tmp/log.txt ]; then
echo "文件为空或不存在"
fi
# 比较两个文件的新旧
if [ file1.txt -nt file2.txt ]; then
echo "file1.txt 比 file2.txt 新"
fi
字符串比较操作符:
-z string - 字符串长度为 0(空字符串)
-n string - 字符串长度不为 0(非空字符串)
string1 = string2 - 字符串相等
string1 != string2 - 字符串不等
示例:
# 检查变量是否为空
name=""
if [ -z "$name" ]; then
echo "变量为空"
fi
# 检查变量是否非空
name="neo"
[ -n "$name" ] && echo "变量非空: $name"
# 字符串相等比较
user="root"
if [ "$user" = "root" ]; then
echo "是 root 用户"
fi
# 字符串不等比较
if [ "$user" != "guest" ]; then
echo "不是 guest 用户"
fi
# 注意:变量应该用引号包裹,防止 word splitting
[ "$var" = "value" ] # 正确
[ $var = "value" ] # 危险:如果 $var 为空会报错
整数比较操作符:
n1 -eq n2 - n1 等于 n2
n1 -ne n2 - n1 不等于 n2
n1 -lt n2 - n1 小于 n2
n1 -le n2 - n1 小于等于 n2
n1 -gt n2 - n1 大于 n2
n1 -ge n2 - n1 大于等于 n2
示例:
# 检查数字是否相等
count=5
if [ "$count" -eq 5 ]; then
echo "计数为 5"
fi
# 检查数字范围
age=25
if [ "$age" -ge 18 ] && [ "$age" -le 65 ]; then
echo "年龄在 18-65 之间"
fi
# 检查进程数
procs=$(ps aux | wc -l)
if [ "$procs" -gt 100 ]; then
echo "进程数过多: $procs"
fi
# 检查返回值
command
if [ $? -ne 0 ]; then
echo "命令执行失败"
fi
记忆技巧:
eq = equal
ne = not equal
lt = less than
le = less than or equal
gt = greater than
ge = greater than or equal
组合多个条件:
expr1 -a expr2 - 逻辑与(expr1 和 expr2 都为真)
expr1 -o expr2 - 逻辑或(expr1 或 expr2 为真)
! expr - 逻辑非
使用 shell 操作符(推荐):
expr1 && expr2 - 逻辑与
expr1 || expr2 - 逻辑或
! expr - 逻辑非
示例:
# 逻辑与:文件存在且可执行
[ -f /usr/bin/munin-cron ] && [ -x /usr/bin/munin-cron ] && /usr/bin/munin-cron
# 使用 test 的 -a 操作符
test -f /etc/passwd -a -r /etc/passwd && echo "文件存在且可读"
# 逻辑或:目录不存在则创建
[ -d /tmp/test ] || mkdir /tmp/test
# 逻辑非:文件不存在
[ ! -f /tmp/lock ] && echo "锁文件不存在"
# 复杂条件组合
if [ -f "$file" ] && [ -r "$file" ] && [ -s "$file" ]; then
echo "文件存在、可读且非空"
fi
# 嵌套条件
if [ "$user" = "root" ] || ([ "$user" = "admin" ] && [ -w "$file" ]); then
echo "有权限"
fi
# 基本 if 结构
if [ -f /etc/passwd ]; then
echo "文件存在"
fi
# if-else 结构
if [ -d /var/log ]; then
echo "目录存在"
else
echo "目录不存在"
fi
# if-elif-else 结构
if [ -f "$file" ]; then
echo "是普通文件"
elif [ -d "$file" ]; then
echo "是目录"
elif [ -L "$file" ]; then
echo "是符号链接"
else
echo "未知类型"
fi
# 多条件判断
if [ -f "$config" ] && [ -r "$config" ]; then
source "$config"
elif [ -f "$default_config" ]; then
source "$default_config"
else
echo "没有配置文件"
exit 1
fi
# while 循环:条件为真时执行
count=0
while [ $count -lt 5 ]; do
echo "计数: $count"
count=$((count + 1))
done
# until 循环:条件为假时执行
until [ -f /tmp/ready ]; do
echo "等待文件创建..."
sleep 2
done
# 读取用户输入
while [ "$answer" != "yes" ] && [ "$answer" != "no" ]; do
read -p "请输入 yes 或 no: " answer
done
# 检查命令是否存在
if [ -x /usr/bin/git ]; then
echo "git 已安装"
else
echo "git 未安装"
exit 1
fi
# 检查用户权限
if [ "$(id -u)" -ne 0 ]; then
echo "需要 root 权限运行"
exit 1
fi
# 文件备份脚本
src="/data/important.db"
backup="/backup/$(date +%Y%m%d)_important.db"
if [ -f "$src" ] && [ -s "$src" ]; then
cp "$src" "$backup"
echo "备份成功: $backup"
else
echo "源文件不存在或为空"
exit 1
fi
# 检查磁盘空间
available=$(df / | tail -1 | awk '{print $4}')
threshold=1048576 # 1GB in KB
if [ "$available" -lt "$threshold" ]; then
echo "警告:磁盘空间不足 1GB"
fi
# 等待服务启动
timeout=30
count=0
while [ $count -lt $timeout ]; do
if [ -S /var/run/mysql.sock ]; then
echo "MySQL 已启动"
break
fi
sleep 1
count=$((count + 1))
done
if [ $count -eq $timeout ]; then
echo "MySQL 启动超时"
exit 1
fi
Bash 提供 [[ ]] 作为 [ ] 的增强版本:
支持正则表达式匹配:=~
支持 && 和 || 在测试内部使用
不需要对变量加引号(自动处理)
支持模式匹配:== 配合通配符
# 正则表达式匹配
if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "有效的邮箱地址"
fi
# 模式匹配
if [[ "$filename" == *.jpg ]]; then
echo "是 JPEG 图片"
fi
# 内部使用逻辑操作符
if [[ -f "$file" && -r "$file" ]]; then
echo "文件存在且可读"
fi
# 字符串比较(不需要引号)
if [[ $user == root ]]; then
echo "是 root 用户"
fi
# 字典序比较
if [[ "apple" < "banana" ]]; then
echo "apple 在 banana 之前"
fi
注意:[[ ]] 是 Bash 扩展,不兼容 POSIX sh。如果需要可移植性,使用 [ ]。
# 错误:方括号内没有空格 if [-f /etc/passwd]; then # 错误! if [ -f /etc/passwd ]; then # 正确 # 错误:整数比较使用字符串操作符 if [ "$count" = "5" ]; then # 字符串比较 if [ "$count" -eq 5 ]; then # 整数比较(正确) # 危险:未加引号的变量 if [ $file = "test.txt" ]; then # 如果 $file 为空会报错 if [ "$file" = "test.txt" ]; then # 安全 # 错误:使用 = 比较数字 if [ $age = 18 ]; then # 字符串比较 if [ $age -eq 18 ]; then # 整数比较(正确) # 错误:在 [ ] 中使用 && 和 || if [ -f file1 && -f file2 ]; then # 错误! if [ -f file1 ] && [ -f file2 ]; then # 正确