Difference between revisions of "Bash (简体中文)"

From ArchWiki
Jump to navigation Jump to search
m
 
(59 intermediate revisions by 10 users not shown)
Line 1: Line 1:
 
[[Category:简体中文]]
 
[[Category:简体中文]]
 
[[Category:Command shells (简体中文)]]
 
[[Category:Command shells (简体中文)]]
 +
[[de:Bash]]
 
[[en:Bash]]
 
[[en:Bash]]
[[es:Bashrc]]
+
[[es:Bash]]
 
[[it:Bash]]
 
[[it:Bash]]
[[nl:Bashrc]]
+
[[ja:Bash]]
{{Translateme (简体中文)}}
+
[[ru:Bash]]
 +
{{TranslationStatus (简体中文)|Bash|2012-10-15|228872}}
  
'''Bash''' (Bourne-again Shell) 是一个[[Command shell|外壳]]/编程语言,来自 [[GNU Project]]。它的名字是向它的前身——很早以前的 Bourne shell 致敬。Bash 可以运行在大部分类 UNIX 操作系统中,包括 GNU/Linux。  
+
'''Bash''' (Bourne-again Shell) 是一个来自 [[GNU Project]]的[[Command-line shell|命令行解释器]]/编程语言。它的名字是向它的前身——很早以前的 Bourne shell 致敬。Bash 可以运行在大部分类 UNIX 操作系统中,包括 GNU/Linux。  
  
 
==调用==
 
==调用==
Bash behaviour can be altered depending on how it is invoked. Some descriptions of different modes follow.
+
Bash调用方式的不同会导致Bash运行方式的不同。下面是在不同模式下运行的Bash的描述。
 
===登录外壳===
 
===登录外壳===
If Bash is spawned by {{ic|login}} in a tty, by an [[SSH]] daemon, or similar means, it is considered a login shell. This mode can also be engaged using the {{Ic|-l}} or {{Ic|--login}} command line options.
+
如果Bash由在tty中的{{ic|登录}}, [[SSH]] 守护进程, 或者其它类似的方式而派生出来, 它就被称为登录外壳(shell)。你可以使用命令行选项{{Ic|-l}} 或者 {{Ic|--login}} 来使用这个种模式。
  
 
===交互式外壳===
 
===交互式外壳===
Bash is considered an interactive shell if it is started neither with the {{Ic|-c}} option nor any non-option arguments, and whose standard input and error are connected to terminals.
+
如果Bash在启动的时候既没有使用 {{Ic|-c}} 选项也没有使用非选项参数,那我们就认为它是一个交互式外壳,同时Bash的标准输出和标准错误被链接到终端上。
  
 
===符合 POSIX===
 
===符合 POSIX===
Bash can be run with enhanced POSIX compliance by starting Bash with the {{Ic|--posix}} command-line option or executing ‘{{Ic|set -o posix}}’ while Bash is running.
+
通过在Bash启动时使用 {{Ic|--posix}} 命令行参数或者在启动后执行 ‘{{Ic|set -o posix}}’ 来使Bash在增强的POSIX标准下运行。
  
 
===传统模式===
 
===传统模式===
In Arch {{ic|/bin/sh}} (which used to be the Bourne shell executable) is symlinked to {{ic|/bin/bash}}.
+
在Arch下 {{ic|/bin/sh}} (过去是Bourne shell)被符号链接至{{ic|/bin/bash}}
  
If Bash is invoked with the name {{Ic|sh}}, it tries to mimic the startup behavior of historical versions of {{Ic|sh}} as closely as possible.
+
如果以命令名{{Ic|sh}}来调用Bash, Bash会尽可能地模仿历史版本的{{Ic|sh}}的启动过程,包括 POSIX 兼容性。
 +
 
 +
在传统模式下登陆运行的shell来源于/etc/profile,然后是~/.profile。
  
 
==配置==
 
==配置==
{{poor writing}}
+
通过如下配置文件进行配置:
===配置文件概览===
 
 
* {{ic|/etc/profile}}
 
* {{ic|/etc/profile}}
 
* {{ic|~/.bash_profile}}
 
* {{ic|~/.bash_profile}}
 
* {{ic|~/.bash_login}}
 
* {{ic|~/.bash_login}}
 
* {{ic|~/.profile}}
 
* {{ic|~/.profile}}
* {{ic|/etc/bash.bashrc}} (''Non-standard'': only some distros, Arch included)
+
* {{ic|/etc/bash.bashrc}} (''非标准'': 只对部分发行版有效,Arch包含在这部分中)
 
* {{ic|~/.bashrc}}
 
* {{ic|~/.bashrc}}
 
* {{ic|~/.bash_logout}}
 
* {{ic|~/.bash_logout}}
An overview of the commonly used configuration files:
 
====/etc/profile====
 
{{ic|/etc/profile}} is sourced by all Bourne-compatible shells upon login. It sets up an environment upon login and loads application-specific ({{ic|/etc/profile.d/*.sh}}) settings.
 
 
====.profile====
 
This file is read and sourced by bash when an interactive login shell is started.
 
  
====.bashrc====
+
常用的配置文件:
The file {{ic|~/.bashrc}} is read and sourced by bash when a non-login interactive shell is started, for example, when you open a virtual console from the desktop environment. This file is useful for setting up a user-specific shell environment.
+
* {{ic|/etc/profile}}被所有兼容Bourne shell的shell在登录时引用。它在登录时建立了环境并且加载了应用程序特定({{ic|/etc/profile.d/*.sh}})的设置。
 +
* {{ic|~/.profile}}: 此文件在启动一个交互式的登录shell时被Bash所读入和引用。
 +
* {{ic|~/.bashrc}} 此文件在启动一个交互式的非登录shell时被Bash所读入和引用。比如当你从桌面环境中打开一个虚拟控制台时。这个文件在用户自定义自己的shell环境时特别有用。
  
===配置文件引用顺序===
+
===配置文件在启动时的引用顺序===
These files are sourced by bash in different circumstances.
+
这些文件在不同的情形下被Bash所引用。
* if interactive + login shell → {{ic|/etc/profile}} then the first readable of {{ic|~/.bash_profile}}, {{ic|~/.bash_login}}, and {{ic|~/.profile}}
+
* 如果交互式+登录shell → {{ic|/etc/profile}} 然后按以下顺序读取 {{ic|~/.bash_profile}}, {{ic|~/.bash_login}}, and {{ic|~/.profile}}
**Bash will source {{ic|~/.bash_logout}} upon exit.
+
**Bash会在退出时引用{ic|~/.bash_logout}}
* if interactive + non-login shell → {{ic|/etc/bash.bashrc}} then {{ic|~/.bashrc}}
+
* 如果交互式+非登录shell → {{ic|/etc/bash.bashrc}} 然后 {{ic|~/.bashrc}}
* if login shell + legacy mode → {{ic|/etc/profile}} then {{ic|~/.profile}}
+
* 如果交互式+传统模式 → {{ic|/etc/profile}} 然后 {{ic|~/.profile}}
  
But, in Arch, by default:
+
但是,在Arch下,默认的:
* {{ic|/etc/profile}} (indirectly) sources {{ic|/etc/bash.bashrc}}
+
* {{ic|/etc/profile}} (间接地) 引用 {{ic|/etc/bash.bashrc}}
* {{ic|/etc/skel/.bash_profile}} which users are encouraged to copy to {{ic|~/.bash_profile}}, sources {{ic|~/.bashrc}}
+
* {{ic|/etc/skel/.bash_profile}} Arch鼓励用户将{{ic|/etc/skel/.bash_profile}}复制到 {{ic|~/.bash_profile}}, 并引用 {{ic|~/.bashrc}}
which means that {{ic|/etc/bash.bashrc}} and {{ic|~/.bashrc}} will be executed for all interactive shells, whether they are login shells or not.
+
这意味着 {{ic|/etc/bash.bashrc}} {{ic|~/.bashrc}} 将会为所有的交互式shell所执行, 不管它是不是登录shell.
  
Examples of the user dotfiles can be found in {{ic|/etc/skel/}}.
+
用户dotfiles的例子可以在{{ic|/etc/skel/}}中被找到。
  
{{Note|legacy mode is when invoked with the name {{Ic|sh}}}}
+
{{注意|传统模式指以{{Ic|sh}}来调用}}
  
 
===外壳和环境变量===
 
===外壳和环境变量===
The behavior of bash and programs run by it can be influenced by a number of environment variable. Environment variables are used to store useful values such as command search directories, or which browser to use. When a new shell or script is launched it inherits its parent's variables, thus starting with an internal set of shell variables[http://www.kingcomputerservices.com/unix_101/understanding_unix_shells_and_environment_variables.htm ].
+
Bash的行为和通过它来运行的程序会被许多的环境变量所影响。环境变量被用于储存有用的值比如命令搜索路径,或者使用哪个浏览器。当一个新的shell或者脚本被执行时,这个shell会继承它的父shell的变量, 因此这个shell会以内部的shell变量启动[http://www.kingcomputerservices.com/unix_101/understanding_unix_shells_and_environment_variables.htm ]
  
These shell variables in bash can be exported in order to become environment variables:
+
这些Bash中的shell变量可以被导出以变成环境变量:
 
  VARIABLE=content
 
  VARIABLE=content
 
  export VARIABLE
 
  export VARIABLE
or with a shortcut
+
或者:
 
  export VARIABLE=content
 
  export VARIABLE=content
  
Environment variables are conventionally placed in {{ic|~/.profile}} or {{ic|/etc/profile}} so that all bourne-compatible shells can use them.
+
环境变量依照惯例放置在{{ic|~/.profile}}或者{{ic|/etc/profile}},这样所有兼容Bourne shell的shell都可以使用。
  
See [[Environment Variables]] for more general information.
+
参阅[[Environment variables]]以获得更加全面的信息。
  
 
==命令行==
 
==命令行==
Bash command line is managed by the separate library called [[Readline]]. Readline provides a lot of shortcuts for interacting with the command line i.e. moving back and forth on the word basis, deleting words etc. It is also Readline's responsibility to manage [[Readline#History|history]] of input commands. Last, but not least, it allows you to create [[Readline#Macros|macros]].
+
Bash的命令行由一个叫做[[Readline]]的分离库来管理。Readline提供了很多Bash命令行交互的快捷键,比如说,光标单词间向前向后移动,删除单词等等。管理输入[[Readline#History|历史]]也是Readline的职责。最后一点也非常重要, 它允许你创造[[Readline#Macros|]]
  
 
==别名==
 
==别名==
[[Wikipedia:alias|alias]] is a command, which enables a replacement of a word with another string. It is often used for abbreviating a system command, or for adding default arguments to a regularly used command.
+
[[Wikipedia:alias|alias]]是一个命令, 它让用其它字符串替代一句话成为可能。这个命令常常被用来缩短系统命令,或者用来将默认参数加入到常用命令中。
  
Personal aliases are preferably stored in {{ic|~/.bashrc}}, and system-wide aliases (which affect all users) belong in {{ic|/etc/bash.bashrc}}.
+
用户个人的别名(alias)最好保存在{{ic|~/.bashrc}}, 而系统级的别名(这些别名会影响所有用户)存放在{{ic|/etc/bash.bashrc}}
  
An example excerpt from {{ic|~/.bashrc}} covering several time-saving aliases:
+
==函数==
{{hc|~/.bashrc
+
Bash也支持函数。下面这个函数可以解压多种类型的压缩文件。将下面这个函数加入{{ic|~/.bashrc}}中并以这个语法{{Ic|extract <file1> <file2> ...}}使用它。
|2=<nowiki>
 
# modified commands
 
alias diff='colordiff'              # requires colordiff package
 
alias grep='grep --color=auto'
 
alias more='less'
 
alias df='df -h'
 
alias du='du -c -h'
 
alias mkdir='mkdir -p -v'
 
alias nano='nano -w'
 
alias ping='ping -c 5'
 
alias ..='cd ..'
 
 
 
# new commands
 
alias da='date "+%A, %B %d, %Y [%T]"'
 
alias du1='du --max-depth=1'
 
alias hist='history | grep $1'      # requires an argument
 
alias openports='netstat --all --numeric --programs --inet --inet6'
 
alias pg='ps -Af | grep $1'        # requires an argument (note: /usr/bin/pg is installed by the util-linux package; maybe a different alias name should be used)
 
 
 
# privileged access
 
if [ $UID -ne 0 ]; then
 
    alias sudo='sudo '
 
    alias scat='sudo cat'
 
    alias svim='sudo vim'
 
    alias root='sudo su'
 
    alias reboot='sudo reboot'
 
    alias halt='sudo halt'
 
    alias update='sudo pacman -Su'
 
    alias netcfg='sudo netcfg2'
 
fi
 
 
 
# ls
 
alias ls='ls -hF --color=auto'
 
alias lr='ls -R'                    # recursive ls
 
alias ll='ls -l'
 
alias la='ll -A'
 
alias lx='ll -BX'                  # sort by extension
 
alias lz='ll -rS'                  # sort by size
 
alias lt='ll -rt'                  # sort by date
 
alias lm='la | more'
 
 
 
# safety features
 
alias cp='cp -i'
 
alias mv='mv -i'
 
alias rm='rm -I'                    # 'rm -i' prompts for every file
 
alias ln='ln -i'
 
alias chown='chown --preserve-root'
 
alias chmod='chmod --preserve-root'
 
alias chgrp='chgrp --preserve-root'
 
 
 
# pacman aliases (if applicable, replace 'pacman' with 'yaourt'/'pacaur'/whatever)
 
alias pac="pacman -S"      # default action    - install one or more packages
 
alias pacu="pacman -Syu"  # '[u]pdate'        - upgrade all packages to their newest version
 
alias pacs="pacman -Ss"    # '[s]earch'        - search for a package using one or more keywords
 
alias paci="pacman -Si"    # '[i]nfo'          - show information about a package
 
alias pacr="pacman -R"    # '[r]emove'        - uninstall one or more packages
 
alias pacl="pacman -Sl"    # '[l]ist'          - list all packages of a repository
 
alias pacll="pacman -Qqm"  # '[l]ist [l]ocal'  - list all packages which were locally installed (e.g. AUR packages)
 
alias paclo="pacman -Qdt"  # '[l]ist [o]rphans' - list all packages which are orphaned
 
alias paco="pacman -Qo"    # '[o]wner'          - determine which package owns a given file
 
alias pacf="pacman -Ql"    # '[f]iles'          - list all files installed by a given package
 
alias pacc="pacman -Sc"    # '[c]lean cache'    - delete all not currently installed package files
 
alias pacm="makepkg -fci"  # '[m]ake'          - make package from PKGBUILD file in current directory
 
</nowiki>}}
 
 
 
==Functions==
 
Bash also support functions. The following function will extract a wide range of compressed file types. Add the function to {{ic|~/.bashrc}} and use it with the syntax {{Ic|extract <file1> <file2> ...}}
 
  
 
{{hc|~/.bashrc
 
{{hc|~/.bashrc
Line 191: Line 123:
 
</nowiki>}}
 
</nowiki>}}
  
{{note|[[Bash]] users should make sure extglob is enabled: {{Ic|shopt -s extglob}}, for example by adding it to the {{ic|.bashrc}}. It is enabled by default if using [[Bash#Advanced completion|Bash completion]]. [[Zsh]] users should do: {{Ic|setopt kshglob}} instead.}}
+
{{注意|[[Bash]]用户应该确保extglob功能被打开: {{Ic|shopt -s extglob}}, 比如说将它加入到{{ic|.bashrc}}。如果使用[[Bash#Advanced completion|Bash completion]]{{Broken section link}},这个功能将默认被打开。 [[Zsh]]用户应该这样做: 执行{{Ic|setopt kshglob}}来替代上面的操作。}}
 +
 
 +
另一个实现方式就是安装''unp''包。
  
Another way to do this is to install ''unp'' package.
+
通常进入到另一个目录后我们会用ls来列出目录下的文件。所以我们可以写一个函数来同时做这两件事情。
 +
这个例子中我们把函数命名为'cl'并且会在给定的目录不存在时报错。
 +
{{hc|~/.bashrc
 +
|2=<nowiki>
 +
cl()
 +
{
 +
if [ -d $1 ]; then
 +
cd $1
 +
ls
 +
else
 +
echo "bash: cl: $1: Directory not found"
 +
fi
 +
}
 +
</nowiki>}}
 +
当然ls命令可以被改变以适应你的需求, 比如'ls -hall --color=auto'
 +
 
 +
更多bash函数的例子在[https://bbs.archlinux.org/viewtopic.php?id=30155 这里。]
  
 
==提示与技巧==
 
==提示与技巧==
 
===自定义提示符===
 
===自定义提示符===
The bash prompt is governed by the variable {{Ic|$PS1}}. To colorize the bash prompt, first comment out the default {{Ic|$PS1}}:
+
Bash提示符由变量{{Ic|$PS1}}控制。为了让提示符色彩丰富些, 首先要注释掉默认的{{Ic|$PS1}}:
 
  #PS1='[\u@\h \W]\$ '
 
  #PS1='[\u@\h \W]\$ '
Then add the following line:
+
然后加入下面这句:
 
  PS1='\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[0;31m\]\$ \[\e[m\]\[\e[0;32m\] '
 
  PS1='\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[0;31m\]\$ \[\e[m\]\[\e[0;32m\] '
This {{Ic|$PS1}} is useful for a root bash prompt, with red designation and green console text. For details on customizing your bash prompt, see [[Color Bash Prompt]].
+
{{Ic|$PS1}}将shell改变成红色的名称和绿色的控制台文本,这对一个root权限的bash提示符十分有用。欲了解更多关于自定义shell的内容, 参阅[[Color Bash Prompt (简体中文)]]
  
 
===自动命令补全===
 
===自动命令补全===
It is useful to have the auto-complete feature (pressing {{Keypress|Tab}} key twice on the keyboard) after you type some command like sudo.
+
当你键入一些命令比如sudo时,自动补全功能(在键盘上按{{ic|Tab}}两次)显得尤其有用。
  
To do this add a line in this format to your {{ic|~/.bashrc}} file:
+
你可以加入以下内容到{{ic|~/.bashrc}}文件中以实现补全功能:
 
  complete -cf your_command
 
  complete -cf your_command
  
For example, to enable auto-complete after sudo and man:
+
比如说,为了激活sudo和man之后的自动补全功能,可以这样:
 
  complete -cf sudo
 
  complete -cf sudo
 
  complete -cf man
 
  complete -cf man
  
 
====高级的补全方法====
 
====高级的补全方法====
Despite Bash's native support for basic file name, command, and variable auto-completion, there are ways of improving and extending its reach.
+
尽管Bash原生支持基本的文件名,命令和变量的自动补全, 我们仍然可以通过一些方法扩充它的功能。
  
The {{Pkg|bash-completion}} package extends functionality by adding auto-completion to a wide range of commands and their options. Enabling advanced bash completion is quite simple, just install the following package:
+
{{Pkg|bash-completion}}通过将自动补全扩充到一个更加广泛的的命令和他们的选项中去使自动补全在shell中的表现更加强大。激活高级补全的方法也非常简单,只需要安装这个包就可以:
 
  # pacman -S bash-completion
 
  # pacman -S bash-completion
Start a new shell and it will be automatically enabled thanks to {{ic|/etc/bash.bashrc}}.
+
启动一个新的shell,然后它由于配置文件{{ic|/etc/bash.bashrc}}的作用就会自动激活补全了。
 +
{{注意|如果你加入了类似于上文提到的"complete -cf sudo"的设置,并且在Bash自动补全中出现问题,尝试删除那些设置语句。}}
 +
 
 +
{{注意|1=通常你使用过去的这些命令操作"$ ls file.*<tab><tab>"来补全命令语句,但这可能不会正常的工作,除非你为需要退回到正常全局补全的程序执行下面的命令"$ compopt -o bashdefault <prog>"。参见 https://bbs.archlinux.org/viewtopic.php?id=128471 和 https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html}}
  
 
====更快的补全操作====
 
====更快的补全操作====
By appending the following into the readline initialization file ({{ic|~/.inputrc}} or {{ic|/etc/inputrc}} by default):
+
通过加入下面这句话到readline默认的初始化文件({{ic|~/.inputrc}}或者{{ic|/etc/inputrc}}):
 
  set show-all-if-ambiguous on
 
  set show-all-if-ambiguous on
it is no longer necessary to hit {{Keypress|Tab}} (default binding) twice to produce a list of all possible completions (both when a partial completion is possible and when no completion is possible), as a single key-press will suffice. Alternatively, to produce such a list only when no completion is possible (i.e., not when a partial completion is possible), append the following command in lieu of the previous one:
+
之后没有必要敲击{{ic|Tab}}(默认绑定)两次来产生可能的补全列表(包括有多种补全可能或者没有补全可能时), 因为一次敲击就可以实现。 作为另外一种选择, 产生补全列表只有在没有可能的补全下(比如, 没有多种补全可能时), 将上面的设置语句替换成下面这条:
 
  set show-all-if-unmodified on
 
  set show-all-if-unmodified on
 +
 +
===命令未找到时的钩子拓展(HOOKS)===
 +
包[[pkgfile]]包括一个"command not found"的钩子拓展,这个钩子拓展将在你键入未识别命令时自动搜索[[官方软件仓库]]。然后显示下面的信息:
 +
 +
{{hc|$ abiword|
 +
abiword may be found in the following packages:
 +
  extra/abiword 2.8.6-7 usr/bin/abiword
 +
}}
 +
 +
AUR包提供了另外一个"command not found"钩子拓展。{{AUR|command-not-found}}, 它会产生像这样的输出:
 +
 +
{{hc|$ abiword|
 +
The command 'abiword' is been provided by the following packages:
 +
abiword (2.8.6-7) from extra
 +
[ abiword ]
 +
abiword (2.8.6-7) from staging
 +
[ abiword ]
 +
abiword (2.8.6-7) from testing
 +
[ abiword ]
 +
}}
  
 
=== 终端中禁用 Ctrl+z ===
 
=== 终端中禁用 Ctrl+z ===
You can disable {{Keypress|Ctrl+z}} (pauses/closes your CLI application) feature for you CLI by wrapping your command in this script
+
你可以为你的命令行界面关闭{{ic|Ctrl+z}} (暂停/关闭你的命令行界面程序)的功能通过在这个脚本中包装命令
 
  #!/bin/bash
 
  #!/bin/bash
 
  trap "" 20
 
  trap "" 20
 
  /path_to_your_application/
 
  /path_to_your_application/
example:
+
例子:
 
  #!/bin/bash
 
  #!/bin/bash
 
  trap "" 20
 
  trap "" 20
 
  /usr/bin/adom
 
  /usr/bin/adom
  
With this example script, when you accidentally press {{Keypress|Ctrl+z}} instead of {{Keypress|Shift+z}} or some other key combination while playing Adom(game) your game will not end. Nothing will happen because {{Keypress|Ctrl+z}} will be ignored.
+
有了这个例子脚本,当你在玩Adom(游戏)要按{{ic|Shift+z}}组合键时不小心按下了{{ic|Ctrl+z}}组合键,你的游戏就不会停止运行了。其实什么都会发生因为我们已经禁用了{{ic|Ctrl+z}}
  
 
===登出后清空屏幕===
 
===登出后清空屏幕===
To clear the screen after logging out on a virtual terminal, append the following lines to {{ic|~/.bash_logout}}:
+
当登出虚拟终端时,为了实现清屏操作,可以加入下面的语句到{{ic|~/.bash_logout}}:
 
  clear
 
  clear
 
  reset
 
  reset
  
===ASCII art, fortunes and cowsay===
+
===ASCII的艺术, fortunes和cowsay===
Along with a colors, system info and ASCII symbols, Bash can be made to display a piece of ASCII art on login.  ASCII images can be found online and pasted into a text file, or generated from scratch.  To set the image to display in a terminal on login, place the string
+
有了色彩,系统信息和ASCII符号,我们就可以让Bash在登录时展示出一幅ASCII的艺术品。ASCII图片可以在网上找到并粘贴到一个text文件中, 或者通过涂鸦产生。images can be found online and pasted into a text file, or generated from scratch.  To set the image to display in a terminal on login, 将下面的字符串
 
  cat /path/to/text/file
 
  cat /path/to/text/file
at the top of {{ic|~/.bashrc}}.
+
加入{{ic|~/.bashrc}}的顶部。
  
Random poignant, inspirational, silly or snide phrases can also be shown.  To see an example, install the {{Pkg|fortune-mod}} package from the {{Ic|extra}} repository.
+
Bash也可以随机显示一些伤感的,激动人心的,可笑的,讽刺的短句。你可以{{Ic|extra}}库中下载安装{{Pkg|fortune-mod}}包来显示一个例子。
  
{{bc|1=
+
{{hc|$ fortune|
'''<font color=red>(</font><font color=green>user@host</font><font color=red>)-(</font><font color=green>10:10 AM Wed Dec 22</font><font color=red>)'''
 
--(</font><font color=green>~</font><font color=red>)---> </font> fortune
 
<br/>
 
 
It is Texas law that when two trains meet each other at a railroad crossing,
 
It is Texas law that when two trains meet each other at a railroad crossing,
 
each shall come to a full stop, and neither shall proceed until the other
 
each shall come to a full stop, and neither shall proceed until the other
Line 259: Line 229:
 
has gone.}}
 
has gone.}}
  
To have a random  phrase displayed when logging into a terminal, just set
+
如果要使短句在登录时随机出现,只需要将下面这句话
 
  command fortune
 
  command fortune
as the top line in {{ic|~/.bashrc}}.
+
加入到{{ic|~/.bashrc}}的顶部。
  
{{Note|By default, {{Ic|fortune}} displays quotes and phrases that are rather inoccuous. However, the package does contain a set of comments some will find offensive, located in {{ic|/usr/share/fortune/off}}. See the man page for more info on these.}}
+
{{Note|默认情况下,{{Ic|fortune}}显示的引用短语都是无伤大雅的。尽管如此,包里面确实包含了一些无礼的言论,它们放在{{ic|/usr/share/fortune/off}}。你可以查看man手册已得到更多的信息。}}
  
These two features can be combined, using the program {{Pkg|cowsay}}. Modify the line at the top of {{ic|~/.bashrc}} to read
+
这两个功能可以合并在一起,通过这个程序{{Pkg|cowsay}}。改变{{ic|~/.bashrc}}的顶部行来读入下面的命令
 
  command cowsay $(fortune)
 
  command cowsay $(fortune)
  
or
+
或者
 
  command cowthink $(fortune)
 
  command cowthink $(fortune)
  
Line 281: Line 251:
 
                 ||    ||
 
                 ||    ||
  
The ASCII images are generated by {{ic|.cow}} text files located in {{ic|/usr/share/cows}}, and all themes can be listed with the command {{Ic|cowsay -l}} These files can be edited to the user's liking; custom images can also be created from scratch or found on the net. The easiest way create a custom cow file from an image found online would be to open an existing {{ic|.cow}} file in a text editor, copy-and-paste the image from a browser and save the file as a different name.  Test the custom file using
+
ASCII图像通过{{ic|.cow}}txt文件来生成,它位于{{ic|/usr/share/cows}}中,并且所有的主题可以都可以通过这个命令{{Ic|cowsay -l}}来列出。这些文件可以依照用户的喜好进行编辑;自定义的图片可以通过涂鸦和在网上寻找的方式获得。创作一个自定义cow文件的最简方法就是在文本编辑器打开一个存在的{{ic|.cow}}文件,再将浏览器中的ASCII图片复制粘贴到编辑器中,另取名保存即可。你可以用下面的命令测试自定义文件
  
 
  # cowsay -f {{ic|cowfile}} $(fortune)
 
  # cowsay -f {{ic|cowfile}} $(fortune)
  
This can produce some nice eye candy, and the commands used can be more complex.  For a specialized example, take a look [http://bambambambam.wordpress.com/2009/07/04/futurama-ascii-with-slashdot-header-quotes-in-your-terminal/ here.] Another example, to use a random cow, random facial expression, and nicely wrap the text of long fortunes.
+
这个能产生一幅华丽的图画,命令的使用也更加复杂。如果需要更加专业的例子,访问[http://bambambambam.wordpress.com/2009/07/04/futurama-ascii-with-slashdot-header-quotes-in-your-terminal/ 这里。] 另外一个例子,这个例子使用了随机产生的cow,随机的脸部表情,并且把fortunes产生文字和图片漂亮的包装在一起。
  
 
  fortune -a | fmt -80 -s | cowsay -$(shuf -n 1 -e b d g p s t w y) -f $(shuf -n 1 -e $(cowsay -l | tail -n +2)) -n
 
  fortune -a | fmt -80 -s | cowsay -$(shuf -n 1 -e b d g p s t w y) -f $(shuf -n 1 -e $(cowsay -l | tail -n +2)) -n
Line 315: Line 285:
 
               |/`.\`'        ,',');
 
               |/`.\`'        ,',');
 
                   `        (/  (/
 
                   `        (/  (/
'''<font color=red>(</font><font color=green>user@host</font><font color=red>)-(</font><font color=green>10:10 AM Wed Dec 22</font><font color=red>)'''--(</font><font color=green>~</font>)<font color=red>)---></font>
 
  
===ASCII Historical Calendar===
+
{{注意|如果你想要一幅全色彩的类似于cowsay的艺术图,最好的选择就是{{Pkg|ponysay}},通过运行命令'ponysay "command or fortune command"',这个包会在你的终端(在X11或者在TTY中你会获得256全色的ponies)里面显示全色彩的小型马(ponies)图片(版本1.1时超过220种),命令'ponysay -l'显示完整的小型马(ponies)的列表。
To install [http://www.openbsd.org/cgi-bin/man.cgi?query=calendar&sektion=1 calendar] files in your {{ic|~/.calendar}} directory:
+
存在于AUR的一种工具可以用来创作更多的小型马(ponies)的图片(也可创造其它类型),这个工具叫做{{AUR|util-say-git}},而这些新的档案需要存储在$HOME/.local/share/ponysay/ponies和$HOME/.local/share/ponysay/ttyponies,它们分别用在桌面和TTy中。}}
 +
 
 +
===ASCII历史日历===
 +
执行下面命令以安装[http://www.openbsd.org/cgi-bin/man.cgi?query=calendar&sektion=1 calendar]文件在你的{{ic|~/.calendar}}目录中:
 
  $ mkdir -p ~/.calendar
 
  $ mkdir -p ~/.calendar
 
  $ curl -o calendar.rpm http://download.fedora.redhat.com/pub/epel/5/x86_64/calendar-1.25-4.el5.x86_64.rpm
 
  $ curl -o calendar.rpm http://download.fedora.redhat.com/pub/epel/5/x86_64/calendar-1.25-4.el5.x86_64.rpm
 
  $ rpm2cpio calendar.rpm | bsdtar -C ~/.calendar --strip-components=4 -xf - ./usr/share/c*
 
  $ rpm2cpio calendar.rpm | bsdtar -C ~/.calendar --strip-components=4 -xf - ./usr/share/c*
  
This will then print out the calendar items
+
这些会随后显示日历项
 
  $ sed -n "/$(date +%m\\/%d\\\|%b\*\ %d)/p" $(find ~/.calendar /usr/share/calendar -maxdepth 1 -type f -name 'c*' 2>/dev/null);
 
  $ sed -n "/$(date +%m\\/%d\\\|%b\*\ %d)/p" $(find ~/.calendar /usr/share/calendar -maxdepth 1 -type f -name 'c*' 2>/dev/null);
  
===Customise Title===
+
===修正窗口大小调整时的换行===
 +
 
 +
加入你在vi中调整了你的xterm大小,Bash并不会得到resize信号,所以你键入的文本就不会正确的换行,于是它们会重叠提示符。
  
The {{ic|$PROMPT_COMMAND}} variable allows you to execute a command before the prompt. For example, this will change the title to your full current working directory:
+
{{ic|/etc/bash.bashrc}} (来自Debian)用下面的设置 :
 +
# check the window size after each command and, if necessary,
 +
# update the values of LINES and COLUMNS.
 +
shopt -s checkwinsize
  
  export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"'
+
===Bash历史补全===
 +
Bash历史补全功能绑定到方向键上(下,上):
 +
  # ~/.bashrc
 +
bind '"\e[A": history-search-backward'
 +
bind '"\e[B": history-search-forward'
 +
或者放在{{ic|~/.inputrc}}:
 +
# ~/.inputrc
 +
"\e[A": history-search-backward
 +
"\e[B": history-search-forward
 +
更多的信息在[[Readline#History]]和[https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File-Syntax.html]
  
 
==资源==
 
==资源==

Latest revision as of 12:12, 28 August 2018

翻译状态: 本文是英文页面 Bash翻译,最后翻译时间:2012-10-15,点击这里可以查看翻译后英文页面的改动。

Bash (Bourne-again Shell) 是一个来自 GNU Project命令行解释器/编程语言。它的名字是向它的前身——很早以前的 Bourne shell 致敬。Bash 可以运行在大部分类 UNIX 操作系统中,包括 GNU/Linux。

调用

Bash调用方式的不同会导致Bash运行方式的不同。下面是在不同模式下运行的Bash的描述。

登录外壳

如果Bash由在tty中的登录, SSH 守护进程, 或者其它类似的方式而派生出来, 它就被称为登录外壳(shell)。你可以使用命令行选项-l 或者 --login 来使用这个种模式。

交互式外壳

如果Bash在启动的时候既没有使用 -c 选项也没有使用非选项参数,那我们就认为它是一个交互式外壳,同时Bash的标准输出和标准错误被链接到终端上。

符合 POSIX

通过在Bash启动时使用 --posix 命令行参数或者在启动后执行 ‘set -o posix’ 来使Bash在增强的POSIX标准下运行。

传统模式

在Arch下 /bin/sh (过去是Bourne shell)被符号链接至/bin/bash

如果以命令名sh来调用Bash, Bash会尽可能地模仿历史版本的sh的启动过程,包括 POSIX 兼容性。

在传统模式下登陆运行的shell来源于/etc/profile,然后是~/.profile。

配置

通过如下配置文件进行配置:

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile
  • /etc/bash.bashrc (非标准: 只对部分发行版有效,Arch包含在这部分中)
  • ~/.bashrc
  • ~/.bash_logout

常用的配置文件:

  • /etc/profile被所有兼容Bourne shell的shell在登录时引用。它在登录时建立了环境并且加载了应用程序特定(/etc/profile.d/*.sh)的设置。
  • ~/.profile: 此文件在启动一个交互式的登录shell时被Bash所读入和引用。
  • ~/.bashrc 此文件在启动一个交互式的非登录shell时被Bash所读入和引用。比如当你从桌面环境中打开一个虚拟控制台时。这个文件在用户自定义自己的shell环境时特别有用。

配置文件在启动时的引用顺序

这些文件在不同的情形下被Bash所引用。

  • 如果交互式+登录shell → /etc/profile 然后按以下顺序读取 ~/.bash_profile, ~/.bash_login, and ~/.profile
    • Bash会在退出时引用{ic|~/.bash_logout}}。
  • 如果交互式+非登录shell → /etc/bash.bashrc 然后 ~/.bashrc
  • 如果交互式+传统模式 → /etc/profile 然后 ~/.profile

但是,在Arch下,默认的:

  • /etc/profile (间接地) 引用 /etc/bash.bashrc
  • /etc/skel/.bash_profile Arch鼓励用户将/etc/skel/.bash_profile复制到 ~/.bash_profile, 并引用 ~/.bashrc

这意味着 /etc/bash.bashrc~/.bashrc 将会为所有的交互式shell所执行, 不管它是不是登录shell.

用户dotfiles的例子可以在/etc/skel/中被找到。

注意: 传统模式指以sh来调用

外壳和环境变量

Bash的行为和通过它来运行的程序会被许多的环境变量所影响。环境变量被用于储存有用的值比如命令搜索路径,或者使用哪个浏览器。当一个新的shell或者脚本被执行时,这个shell会继承它的父shell的变量, 因此这个shell会以内部的shell变量启动[1]

这些Bash中的shell变量可以被导出以变成环境变量:

VARIABLE=content
export VARIABLE

或者:

export VARIABLE=content

环境变量依照惯例放置在~/.profile或者/etc/profile,这样所有兼容Bourne shell的shell都可以使用。

参阅Environment variables以获得更加全面的信息。

命令行

Bash的命令行由一个叫做Readline的分离库来管理。Readline提供了很多Bash命令行交互的快捷键,比如说,光标单词间向前向后移动,删除单词等等。管理输入历史也是Readline的职责。最后一点也非常重要, 它允许你创造

别名

alias是一个命令, 它让用其它字符串替代一句话成为可能。这个命令常常被用来缩短系统命令,或者用来将默认参数加入到常用命令中。

用户个人的别名(alias)最好保存在~/.bashrc, 而系统级的别名(这些别名会影响所有用户)存放在/etc/bash.bashrc

函数

Bash也支持函数。下面这个函数可以解压多种类型的压缩文件。将下面这个函数加入~/.bashrc中并以这个语法extract <file1> <file2> ...使用它。

~/.bashrc
extract() {
    local c e i

    (($#)) || return

    for i; do
        c=''
        e=1

        if [[ ! -r $i ]]; then
            echo "$0: file is unreadable: \`$i'" >&2
            continue
        fi

        case $i in
        *.t@(gz|lz|xz|b@(2|z?(2))|a@(z|r?(.@(Z|bz?(2)|gz|lzma|xz)))))
               c='bsdtar xvf';;
        *.7z)  c='7z x';;
        *.Z)   c='uncompress';;
        *.bz2) c='bunzip2';;
        *.exe) c='cabextract';;
        *.gz)  c='gunzip';;
        *.rar) c='unrar x';;
        *.xz)  c='unxz';;
        *.zip) c='unzip';;
        *)     echo "$0: unrecognized file extension: \`$i'" >&2
               continue;;
        esac

        command $c "$i"
        e=$?З
    done

    return $e
}
注意: Bash用户应该确保extglob功能被打开: shopt -s extglob, 比如说将它加入到.bashrc。如果使用Bash completion[broken link: invalid section],这个功能将默认被打开。 Zsh用户应该这样做: 执行setopt kshglob来替代上面的操作。

另一个实现方式就是安装unp包。

通常进入到另一个目录后我们会用ls来列出目录下的文件。所以我们可以写一个函数来同时做这两件事情。 这个例子中我们把函数命名为'cl'并且会在给定的目录不存在时报错。

~/.bashrc
cl()
{
if [ -d $1 ]; then
cd $1
ls
else
echo "bash: cl: $1: Directory not found"
fi
}

当然ls命令可以被改变以适应你的需求, 比如'ls -hall --color=auto'。

更多bash函数的例子在这里。

提示与技巧

自定义提示符

Bash提示符由变量$PS1控制。为了让提示符色彩丰富些, 首先要注释掉默认的$PS1:

#PS1='[\u@\h \W]\$ '

然后加入下面这句:

PS1='\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[0;31m\]\$ \[\e[m\]\[\e[0;32m\] '

$PS1将shell改变成红色的名称和绿色的控制台文本,这对一个root权限的bash提示符十分有用。欲了解更多关于自定义shell的内容, 参阅Color Bash Prompt (简体中文)

自动命令补全

当你键入一些命令比如sudo时,自动补全功能(在键盘上按Tab两次)显得尤其有用。

你可以加入以下内容到~/.bashrc文件中以实现补全功能:

complete -cf your_command

比如说,为了激活sudo和man之后的自动补全功能,可以这样:

complete -cf sudo
complete -cf man

高级的补全方法

尽管Bash原生支持基本的文件名,命令和变量的自动补全, 我们仍然可以通过一些方法扩充它的功能。

bash-completion通过将自动补全扩充到一个更加广泛的的命令和他们的选项中去使自动补全在shell中的表现更加强大。激活高级补全的方法也非常简单,只需要安装这个包就可以:

# pacman -S bash-completion

启动一个新的shell,然后它由于配置文件/etc/bash.bashrc的作用就会自动激活补全了。

注意: 如果你加入了类似于上文提到的"complete -cf sudo"的设置,并且在Bash自动补全中出现问题,尝试删除那些设置语句。
注意: 通常你使用过去的这些命令操作"$ ls file.*<tab><tab>"来补全命令语句,但这可能不会正常的工作,除非你为需要退回到正常全局补全的程序执行下面的命令"$ compopt -o bashdefault <prog>"。参见 https://bbs.archlinux.org/viewtopic.php?id=128471https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html

更快的补全操作

通过加入下面这句话到readline默认的初始化文件(~/.inputrc或者/etc/inputrc中):

set show-all-if-ambiguous on

之后没有必要敲击Tab(默认绑定)两次来产生可能的补全列表(包括有多种补全可能或者没有补全可能时), 因为一次敲击就可以实现。 作为另外一种选择, 产生补全列表只有在没有可能的补全下(比如, 没有多种补全可能时), 将上面的设置语句替换成下面这条:

set show-all-if-unmodified on

命令未找到时的钩子拓展(HOOKS)

pkgfile包括一个"command not found"的钩子拓展,这个钩子拓展将在你键入未识别命令时自动搜索官方软件仓库。然后显示下面的信息:

$ abiword
abiword may be found in the following packages:
  extra/abiword 2.8.6-7	usr/bin/abiword

AUR包提供了另外一个"command not found"钩子拓展。command-not-foundAUR, 它会产生像这样的输出:

$ abiword
The command 'abiword' is been provided by the following packages:
abiword (2.8.6-7) from extra
	[ abiword ]
abiword (2.8.6-7) from staging
	[ abiword ]
abiword (2.8.6-7) from testing
	[ abiword ]

终端中禁用 Ctrl+z

你可以为你的命令行界面关闭Ctrl+z (暂停/关闭你的命令行界面程序)的功能通过在这个脚本中包装命令

#!/bin/bash
trap "" 20
/path_to_your_application/

例子:

#!/bin/bash
trap "" 20
/usr/bin/adom

有了这个例子脚本,当你在玩Adom(游戏)要按Shift+z组合键时不小心按下了Ctrl+z组合键,你的游戏就不会停止运行了。其实什么都会发生因为我们已经禁用了Ctrl+z

登出后清空屏幕

当登出虚拟终端时,为了实现清屏操作,可以加入下面的语句到~/.bash_logout:

clear
reset

ASCII的艺术, fortunes和cowsay

有了色彩,系统信息和ASCII符号,我们就可以让Bash在登录时展示出一幅ASCII的艺术品。ASCII图片可以在网上找到并粘贴到一个text文件中, 或者通过涂鸦产生。images can be found online and pasted into a text file, or generated from scratch. To set the image to display in a terminal on login, 将下面的字符串

cat /path/to/text/file

加入~/.bashrc的顶部。

Bash也可以随机显示一些伤感的,激动人心的,可笑的,讽刺的短句。你可以extra库中下载安装fortune-mod包来显示一个例子。

$ fortune
It is Texas law that when two trains meet each other at a railroad crossing,
each shall come to a full stop, and neither shall proceed until the other

has gone.

如果要使短句在登录时随机出现,只需要将下面这句话

command fortune

加入到~/.bashrc的顶部。

Note: 默认情况下,fortune显示的引用短语都是无伤大雅的。尽管如此,包里面确实包含了一些无礼的言论,它们放在/usr/share/fortune/off。你可以查看man手册已得到更多的信息。

这两个功能可以合并在一起,通过这个程序cowsay。改变~/.bashrc的顶部行来读入下面的命令

command cowsay $(fortune)

或者

command cowthink $(fortune)


The earth is like a tiny grain of sand, 
only much, much heavier.                
----------------------------------------- 
       \   ^__^
        \  (oo)\_______
           (__)\       )\/\
               ||----w |
               ||     ||

ASCII图像通过.cowtxt文件来生成,它位于/usr/share/cows中,并且所有的主题可以都可以通过这个命令cowsay -l来列出。这些文件可以依照用户的喜好进行编辑;自定义的图片可以通过涂鸦和在网上寻找的方式获得。创作一个自定义cow文件的最简方法就是在文本编辑器打开一个存在的.cow文件,再将浏览器中的ASCII图片复制粘贴到编辑器中,另取名保存即可。你可以用下面的命令测试自定义文件

# cowsay -f cowfile $(fortune)

这个能产生一幅华丽的图画,命令的使用也更加复杂。如果需要更加专业的例子,访问这里。 另外一个例子,这个例子使用了随机产生的cow,随机的脸部表情,并且把fortunes产生文字和图片漂亮的包装在一起。

fortune -a | fmt -80 -s | cowsay -$(shuf -n 1 -e b d g p s t w y) -f $(shuf -n 1 -e $(cowsay -l | tail -n +2)) -n
 ________________________________________ 
( Fry: I must be a robot. Why else would )
( human women refuse to date me?         )
---------------------------------------- 
       o
         o
           o  
              ,'``.._   ,'``.
             :,--._:)\,:,._,.:
             :`--,@@@:`...';\        
              `,'@@@@@@@`---'@@`.     
              /@@@@@@@@@@@@@@@@@:
             /@@@@@@@@@@@@@@@@@@@\
           ,'@@@@@@@@@@@@@@@@@@@@@:\.___,-.
          `...,---'``````-..._@@@@|:@@@@@@@\
            (                 )@@@;:@@@@)@@@\  _,-.
             `.              (@@@//@@@@@@@@@@`'@@@@\
              :               `.//@@)@@@@@@)@@@@@,@;
              |`.            _,'/@@@@@@@)@@@@)@,'@,'
              :`.`-..____..=:.-':@@@@@.@@@@@_,@@,'
             ,'\ ``--....-)='    `._,@@\    )@@@'``._
            /@_@`.       (@)      /@@@@@)  ; / \ \`-.'
           (@@@`-:`.     `' ___..'@@_,-'   |/   `.)
            `-. `.`.``-----``--,@@.'
              |/`.\`'        ,',');
                  `         (/  (/
注意: 如果你想要一幅全色彩的类似于cowsay的艺术图,最好的选择就是ponysay,通过运行命令'ponysay "command or fortune command"',这个包会在你的终端(在X11或者在TTY中你会获得256全色的ponies)里面显示全色彩的小型马(ponies)图片(版本1.1时超过220种),命令'ponysay -l'显示完整的小型马(ponies)的列表。 存在于AUR的一种工具可以用来创作更多的小型马(ponies)的图片(也可创造其它类型),这个工具叫做util-say-gitAUR,而这些新的档案需要存储在$HOME/.local/share/ponysay/ponies和$HOME/.local/share/ponysay/ttyponies,它们分别用在桌面和TTy中。

ASCII历史日历

执行下面命令以安装calendar文件在你的~/.calendar目录中:

$ mkdir -p ~/.calendar
$ curl -o calendar.rpm http://download.fedora.redhat.com/pub/epel/5/x86_64/calendar-1.25-4.el5.x86_64.rpm
$ rpm2cpio calendar.rpm | bsdtar -C ~/.calendar --strip-components=4 -xf - ./usr/share/c*

这些会随后显示日历项

$ sed -n "/$(date +%m\\/%d\\\|%b\*\ %d)/p" $(find ~/.calendar /usr/share/calendar -maxdepth 1 -type f -name 'c*' 2>/dev/null);

修正窗口大小调整时的换行

加入你在vi中调整了你的xterm大小,Bash并不会得到resize信号,所以你键入的文本就不会正确的换行,于是它们会重叠提示符。

/etc/bash.bashrc (来自Debian)用下面的设置 :

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

Bash历史补全

Bash历史补全功能绑定到方向键上(下,上):

# ~/.bashrc
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

或者放在~/.inputrc:

# ~/.inputrc
"\e[A": history-search-backward
"\e[B": history-search-forward

更多的信息在Readline#History[2]

资源