Difference between revisions of "Bash"

From ArchWiki
Jump to: navigation, search
m (added some templates)
(14 intermediate revisions by the same user not shown)
Line 2: Line 2:
 
{{i18n|Bash}}
 
{{i18n|Bash}}
 
{{Article summary start}}
 
{{Article summary start}}
{{Article summary text|Improving Bash over its default capabilities.}}
+
{{Article summary text|Discussing and improving Bash's capabilities.}}
 
{{Article summary heading|Related}}
 
{{Article summary heading|Related}}
 +
{{Article summary wiki|Readline}}
 +
{{Article summary wiki|Environment Variables}}
 
{{Article summary wiki|Color Bash Prompt}}
 
{{Article summary wiki|Color Bash Prompt}}
{{Article summary wiki|Core Utilities}}
 
{{Article summary wiki|Zsh}}
 
{{Article summary wiki|Heirloom}}
 
 
{{Article summary end}}
 
{{Article summary end}}
'''Bash''' (Bourne-again Shell) is a shell/programming language by the [[GNU Project]]. Its name is a homaging reference to its predecessor: the long-deprecated Bourne shell. Bash can be run on most UNIX-like operating systems, including GNU/Linux. Arch copiously uses Bash throughout its init-scripts.
+
'''Bash''' (Bourne-again Shell) is a [[Command shell|shell]]/programming language by the [[GNU Project]]. Its name is a homaging reference to its predecessor: the long-deprecated Bourne shell. Bash can be run on most UNIX-like operating systems, including GNU/Linux. Arch copiously uses Bash throughout its init-scripts.
  
 
==Configuration==
 
==Configuration==
Line 48: Line 47:
  
 
===Shell and environment variables===
 
===Shell and environment variables===
 +
The behavior of bash and programs run by it can be influenced by a number of environment variable. Environment variables 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 ].
  
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 ].
+
These shell variables in bash can be exported in order to become environment variables:
 
 
These shell variables can be exported in order to become environment variables:
 
 
  VARIABLE=content
 
  VARIABLE=content
 
  export VARIABLE
 
  export VARIABLE
 +
or with a shortcut
 +
export VARIABLE=content
  
 
Environment variables are conventionally placed in {{Filename|~/.profile}} or {{Filename|/etc/profile}} so that all bourne-compatible shells can use them.
 
Environment variables are conventionally placed in {{Filename|~/.profile}} or {{Filename|/etc/profile}} so that all bourne-compatible shells can use them.
Line 59: Line 59:
 
See [[Environment Variables]] for more general information.
 
See [[Environment Variables]] for more general information.
  
====Examples====
+
==Command line==
{{Moveto|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]].
<!-- not specific to bash. zsh/$SHELL users would benefit too. -->
+
 
=====BROWSER=====
+
==Aliases==
The web browser. Helpful to set in an interactive shell configuration file so that it may be dynamically altered depending on the availability of a graphic environment, such as [[X]]:
+
[[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.
 +
 
 +
Personal aliases are preferably stored in {{Filename|~/.bashrc}}, and system-wide aliases (which affect all users) belong in {{Filename|/etc/bash.bashrc}}.
 +
 
 +
An example excerpt from {{Filename|~/.bashrc}} covering several time-saving aliases:
 +
{{File
 +
|name=~/.bashrc
 +
|content=<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 ..'
  
if [ -n "$DISPLAY" ]; then
+
# new commands
BROWSER=firefox
+
alias da='date "+%A, %B %d, %Y [%T]"'
else
+
alias du1='du --max-depth=1'
BROWSER=links
+
alias hist='history | grep $1'      # requires an argument
fi
+
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)
  
=====EDITOR=====
+
# privileged access
Should point to a lightweight text editor, such as {{Codeline|ed}} or {{Codeline|ex}}. Convenient for editing SCM commit logs that do not require a whole lot of features from the application. ex has more features, but it will clear the whole screen, while ed does not.
+
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
  
=====FTP and HTTP proxy=====
+
# ls
FTP and HTTP proxy server, respectively:
+
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'
  
ftp_proxy="ftp://192.168.0.1:21"
+
# safety features
http_proxy="http://192.168.0.1:80"
+
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'
 +
</nowiki>}}
  
 +
==Functions==
 +
Bash also support functions. The following function will extract a wide range of compressed file types. Add the function to {{Filename|~/.bashrc}} and use it with the syntax {{Codeline|extract <file1> <file2> ...}}
  
=====MAIL=====
+
{{File
The location of incoming email. The traditional setting is {{Filename|/var/spool/mail/$LOGNAME}}.
+
|name=~/.bashrc
 +
|content=<nowiki>
 +
extract() {
 +
    local c e i
  
=====PAGER=====
+
    (($#)) || return
The pager called by [[man]] and other applications; for example, {{Codeline|less}}, or {{Codeline|more}}.
 
  
=====PATH=====
+
    for i; do
The {{Codeline|PATH}} variable is a string delimited by colons (:) which specifies the directories to search for when users enter a command name without an explicit path preface. If the command is found in the directories specified in {{Codeline|PATH}}, the program is executed.
+
        c=''
PATH=$PATH:/path/to/directory
+
        e=1
{{Note|It's advised not to include the current working directory (.) into your {{Codeline|PATH}} for security reasons, as it may trick the user to execute vicious commands.}}
 
  
=====VISUAL=====
+
        if [[ ! -r $i ]]; then
Regards full-fledged editors that are used for more demanding tasks, such as editing mail; e.g., {{Codeline|vi}}, [[vim]], [[emacs]], etc.
+
            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
 +
}
 +
</nowiki>}}
 +
 
 +
{{note|[[Bash]] users should make sure extglob is enabled: {{codeline|shopt -s extglob}}. It is enabled by default if using [[Bash#Advanced completion|Bash completion]]. [[Zsh]] users should do: {{codeline|setopt kshglob}} instead.}}
 +
 
 +
Another way to do this is to install ''unp'' package.
  
 
==Tips and tricks==
 
==Tips and tricks==
Line 103: Line 176:
 
This {{Codeline|$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]].
 
This {{Codeline|$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]].
  
===Aliases===
 
An Alias substitutes a word with a user-defined string, this is useful for creating abbreviations of a command or adding default arguments to a command.
 
 
For example, to make rm prompt before every removal:
 
alias rm='rm -i'
 
or once before removing more than three files and when removing recursively
 
alias rm='rm -I'
 
To make cp and mv prompt for overwrite:
 
alias cp='cp -i'
 
alias mv='mv -i'
 
To use vi instead of nano (to force someone to learn vi):
 
alias nano='vi'
 
  
 
===Auto-completion===
 
===Auto-completion===
Line 138: Line 199:
 
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:
 
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:
 
  set show-all-if-unmodified on
 
  set show-all-if-unmodified on
 
===History search===
 
See [[Readline#History|this article]].
 
==== Avoid duplicates ====
 
If you repeat the same command several times, they will all be appended in your history. To prevent this, add to your {{Filename|~/.bashrc}}:
 
export HISTCONTROL=ignoredups
 
 
==== Avoid whitespaces ====
 
To disable logging blank commands add this to your {{Filename|~/.bashrc}}:
 
export HISTCONTROL=ignorespace
 
If your {{Filename|~/.bashrc}} already contains
 
export HISTCONTROL=ignoredups
 
replace it with
 
export HISTCONTROL=ignoreboth
 
  
 
=== Disable Ctrl-Z in terminal===
 
=== Disable Ctrl-Z in terminal===
Line 164: Line 211:
  
 
With this example script, when you accidentally press {{Keypress|Ctrl}}+{{Keypress|Z}} instead of {{Keypress|Shift}}+{{Keypress|Z}} or some other key combo while playing Adom(game) your game will not end. Nothing will happen because {{Keypress|Ctrl}}+{{Keypress|Z}} will be ignored.
 
With this example script, when you accidentally press {{Keypress|Ctrl}}+{{Keypress|Z}} instead of {{Keypress|Shift}}+{{Keypress|Z}} or some other key combo while playing Adom(game) your game will not end. Nothing will happen because {{Keypress|Ctrl}}+{{Keypress|Z}} will be ignored.
 
===Disabling control echo===
 
Due to an update to {{Package Official|readline}}, the terminal now echoes {{Codeline|^C}} after {{Keypress|Ctrl}}+{{Keypress|C}} is pressed. For users who wish to disable this, simply add the following to {{Filename|~/.inputrc}}:
 
set echo-control-characters off
 
 
===Readline macros===
 
Readline also supports binding keys to keyboard macros. For simple example, run this command in Bash:
 
bind '"\ew":"\C-e # macro"'
 
 
or add the part within single quotes to inputrc:
 
"\ew":"\C-e # macro"
 
 
Now type a line and press {{Keypress|Alt}}+{{Keypress|W}}. Readline will act as though {{Keypress|Ctrl}}+{{Keypress|E}} (end-of-line) had been pressed, appended with '{{codeline| # macro}}'.
 
 
Use any of the existing keybindings within a readline macro, which can be quite useful to automate frequently used idioms. For example, this one makes {{Keypress|Ctrl}}+{{Keypress|Alt}}+{{Keypress|L}} append "| less" to the line and run it ({{Keypress|Ctrl}}+{{Keypress|M}} is equivalent to {{Keypress|Enter}}:
 
"\e\C-l":"\C-e | less\C-m"
 
 
The next one prefixes the line with 'yes |' when pressing {{Keypress|Ctrl}}+{{Keypress|Alt}}+{{Keypress|Y}}, confirming any yes/no question the command might ask:
 
"\e\C-y":"\C-ayes | \C-m"
 
 
This example wraps the line in {{Codeline|su -c &#39;&#39;}}, if {{Keypress|Alt}}+{{Keypress|S}} is pressed:
 
"\es":"\C-a su -c '\C-e'\C-m"
 
 
As a last example, quickly send a command in the background with {{Keypress|Ctrl}}+{{Keypress|Alt}}+{{Keypress|B}}, discarding all of its output:
 
"\e\C-b":"\C-e > /dev/null 2>&1 &\C-m"
 
 
===Command-line editing===
 
As stated above, bash is readline-powered. Therefore you may find the readline instructions in the [http://www.gnu.org/software/bash/manual/html_node/Readline-Interaction.html#Readline-Interaction GNU Bash manual] or the shortcuts table at [http://www.bigsmoke.us/readline/shortcuts www.bigsmoke.us] very useful.
 
 
If you are a [[vi]] or vim user, you may want to put the following line to your {{Filename|~/.bashrc}} to enable vi-like keybindings:
 
set -o vi
 
Taken from [http://www.catonmat.net/blog/bash-vi-editing-mode-cheat-sheet/ www.catonmat.net]
 
  
 
===Clear the screen after logging out===
 
===Clear the screen after logging out===
Line 288: Line 303:
 
* [http://wooledge.org/mywiki/BashFaq Greg's Wiki] - Highly recommended
 
* [http://wooledge.org/mywiki/BashFaq Greg's Wiki] - Highly recommended
 
* [http://www.gnu.org/software/bash/manual/bash.html man page]
 
* [http://www.gnu.org/software/bash/manual/bash.html man page]
* [http://tiswww.case.edu/php/chet/readline/rluserman.html Readline Guide]
 
 
* [http://www.grymoire.com/Unix/Quote.html Quote Tutorial]
 
* [http://www.grymoire.com/Unix/Quote.html Quote Tutorial]
 
* irc://irc.freenode.net#bash - Active and friendly Internet Relay Chat channel for Bash.
 
* irc://irc.freenode.net#bash - Active and friendly Internet Relay Chat channel for Bash.

Revision as of 00:24, 12 October 2011

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.


Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어


External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end Bash (Bourne-again Shell) is a shell/programming language by the GNU Project. Its name is a homaging reference to its predecessor: the long-deprecated Bourne shell. Bash can be run on most UNIX-like operating systems, including GNU/Linux. Arch copiously uses Bash throughout its init-scripts.

Configuration

Tango-edit-clear.pngThis article or section needs language, wiki syntax or style improvements.Tango-edit-clear.png

Reason: please use the first argument of the template to provide a brief explanation. (Discuss in Talk:Bash#)

Configuration file overview

An overview of the commonly used configuration files:

/etc/profile

Template:Filename is sourced by all Bourne-compatible shells upon login. It sets up an environment upon login and loads application-specific (Template:Filename) settings.

.profile

This file is read and sourced by bash when an interactive login shell is started.

.bashrc

The file Template:Filename 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.

Configuration file sourcing order

These files are sourced by bash in different circumstances.

But, in Arch, by default:

which means that Template:Filename and Template:Filename will be executed for all interactive shells, whether they are login shells or not.

Examples of the user dotfiles can be found in Template:Filename.

Note: legacy mode is when invoked with the name Template:Codeline

Shell and environment variables

The behavior of bash and programs run by it can be influenced by a number of environment variable. Environment variables 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[1].

These shell variables in bash can be exported in order to become environment variables:

VARIABLE=content
export VARIABLE

or with a shortcut

export VARIABLE=content

Environment variables are conventionally placed in Template:Filename or Template:Filename so that all bourne-compatible shells can use them.

See Environment Variables for more general information.

Command line

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 history of input commands. Last, but not least, it allows you to create macros.

Aliases

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.

Personal aliases are preferably stored in Template:Filename, and system-wide aliases (which affect all users) belong in Template:Filename.

An example excerpt from Template:Filename covering several time-saving aliases: Template:File

Functions

Bash also support functions. The following function will extract a wide range of compressed file types. Add the function to Template:Filename and use it with the syntax Template:Codeline

Template:File

Note: Bash users should make sure extglob is enabled: Template:Codeline. It is enabled by default if using Bash completion. Zsh users should do: Template:Codeline instead.

Another way to do this is to install unp package.

Tips and tricks

Prompt customization

The bash prompt is governed by the variable Template:Codeline. To colorize the bash prompt, first comment out the default Template:Codeline:

#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\] '

This Template:Codeline 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.


Auto-completion

It is useful to have the auto-complete feature (pressing Template:Keypress key twice on the keyboard) after you type some command like sudo.

To do this add a line in this format to your Template:Filename file:

complete -cf your_command

For example, to enable auto-complete after sudo and man:

complete -cf sudo
complete -cf man

Advanced completion

Despite Bash's native support for basic file name, command, and variable auto-completion, there are ways of improving and extending its reach.

The Template:Package Official 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:

# pacman -S bash-completion

Start a new shell and it will be automatically enabled thanks to Template:Filename.

Faster completion

By appending the following into the readline initialization file (Template:Filename or Template:Filename by default):

set show-all-if-ambiguous on

it is no longer necessary to hit Template:Keypress (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:

set show-all-if-unmodified on

Disable Ctrl-Z in terminal

You can disable Template:Keypress+Template:Keypress (pauses/closes your CLI application) feature for you CLI by wrapping your command in this script

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

example:

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

With this example script, when you accidentally press Template:Keypress+Template:Keypress instead of Template:Keypress+Template:Keypress or some other key combo while playing Adom(game) your game will not end. Nothing will happen because Template:Keypress+Template:Keypress will be ignored.

Clear the screen after logging out

To clear the screen after logging out on a virtual terminal, append the following lines to Template:Filename:

clear
reset

ASCII art, fortunes and 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

cat /path/to/text/file

at the top of Template:Filename.

Random poignant, inspirational, silly or snide phrases can also be shown. To see an example, install the Template:Package Official package from the Template:Codeline repository.

Template:Cli

To have a random phrase displayed when logging into a terminal, just set

command fortune

as the top line in Template:Filename.

Note: By default, Template:Codeline displays quotes and phrases that are rather inoccuous. However, the package does contain a set of comments some will find offensive, located in Template:Filename. See the man page for more info on these.

These two features can be combined, using the program Template:Package Official. Modify the line at the top of Template:Filename to read

command cowsay $(fortune)

or

command cowthink $(fortune)


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

The ASCII images are generated by Template:Filename text files located in Template:Filename, and all themes can be listed with the command Template:Codeline 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 Template:Filename 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

# cowsay -f Template:Filename $(fortune)

This can produce some nice eye candy, and the commands used can be more complex. For a specialized example, take a look here.

 ________________________________________ 
( Fry: I must be a robot. Why else would )
( human women refuse to date me?         )
---------------------------------------- 
       o
         o
           o  
              ,'``.._   ,'``.
             :,--._:)\,:,._,.:
             :`--,@@@:`...';\        
              `,'@@@@@@@`---'@@`.     
              /@@@@@@@@@@@@@@@@@:
             /@@@@@@@@@@@@@@@@@@@\
           ,'@@@@@@@@@@@@@@@@@@@@@:\.___,-.
          `...,---'``````-..._@@@@|:@@@@@@@\
            (                 )@@@;:@@@@)@@@\  _,-.
             `.              (@@@//@@@@@@@@@@`'@@@@\
              :               `.//@@)@@@@@@)@@@@@,@;
              |`.            _,'/@@@@@@@)@@@@)@,'@,'
              :`.`-..____..=:.-':@@@@@.@@@@@_,@@,'
             ,'\ ``--....-)='    `._,@@\    )@@@'``._
            /@_@`.       (@)      /@@@@@)  ; / \ \`-.'
           (@@@`-:`.     `' ___..'@@_,-'   |/   `.)
            `-. `.`.``-----``--,@@.'
              |/`.\`'        ,',');
                  `         (/  (/
(user@host)-(10:10 AM Wed Dec 22)--(~))--->

ASCII Historical Calendar

To install calendar files in your Template:Filename directory:

$ 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*

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);

Resources