builtin
Last updated
Was this helpful?
Last updated
Was this helpful?
Was this helpful?
[!TIP|label:references:]
example
without eval
:
$ foo='ls | less'
$ $foo
ls: cannot access '|': No such file or directory
ls: cannot access 'less': No such file or directory
with eval
:
$ foo='ls | less'
$ eval "${foo}"
Applications
Library
System
Users
...
or with bash -c
example
${BASH_SOURCE[0]}
Path to the source file where the current script or function definition resides
${FUNCNAME[0]}
Name of the currently executing function
${LINENO}
Current line number within the script or function where this variable is referenced
${BASH_VERSION}
Version string of the running Bash interpreter
${BASH_LINENO[@]}
Line numbers of each function call in the call stack
${BASH_ARGV[@]}
All passed arguments (in reverse order)
$ cat main.sh
echo "\$0 : $0"
echo "\${BASH_SOURCE[0]} : ${BASH_SOURCE[0]}"
# -- run directly --
$ bash main.sh
$0 : main.sh
${BASH_SOURCE[0]} : main.sh
# -- source --
$ source main.sh
$0 : -bash
${BASH_SOURCE[0]} : main.sh
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
echo "Script is being run directly"
else
echo "Script is being sourced"
fi
[!NOTE]
main.sh
set -o pipefail function foo() { echo "\$0 : $0"; } function bar() { echo "\${BASH_SOURCE[0]} : ${BASH_SOURCE[0]}"; } foo bar
# using basename to avoid the long full path
# +---------------------+
$ export PS4='+\033[38;5;240;3m($(basename ${BASH_SOURCE})\033[0m:\033[36;2;3m$(printf "%3d" ${LINENO})\033[0m\033[37;2;3m):\033[0m\033[35;2;3m${FUNCNAME[0]:+ ${FUNCNAME[0]}():}\033[0m '
# +------+ + italic | | + italic | | + italic
# | | + dim | + dim
# + the #240 color (dark gray) + cyan + magenta
$ echo -e $PS4
+($(basename ${BASH_SOURCE}):$(printf "%3d" ${LINENO})):${FUNCNAME[0]:+ ${FUNCNAME[0]}():}
$ bash -x $HOME/main.sh
+(main.sh: 3): set -o pipefail
+(main.sh: 12): main
+(main.sh: 8): main(): foo
+(main.sh: 5): foo(): echo '$0 : /Users/marslo/main.sh'
$0 : /Users/marslo/main.sh
+(main.sh: 9): main(): bar
+(main.sh: 6): bar(): echo '${BASH_SOURCE[0]} : /Users/marslo/main.sh'
${BASH_SOURCE[0]} : /Users/marslo/main.sh
$ export PS4='+\033[38;5;245m[\033[38;5;243m$(basename "${BASH_SOURCE}")\033[38;5;245m:\033[0;36m${LINENO}\033[38;5;245m]\033[0;35m${FUNCNAME[0]:+ ${FUNCNAME[0]}()}\033[0;32m โถ \033[0m'
$ bash -x $HOME/main.sh
+[main.sh:3] โถ set -o pipefail
+[main.sh:12] โถ main
+[main.sh:8] main() โถ foo
+[main.sh:5] foo() โถ echo '$0 : /Users/marslo/main.sh'
$0 : /Users/marslo/main.sh
+[main.sh:9] main() โถ bar
+[main.sh:6] bar() โถ echo '${BASH_SOURCE[0]} : /Users/marslo/main.sh'
${BASH_SOURCE[0]} : /Users/marslo/main.sh
[!NOTE]reference:
|
!!
: to repeat last commands
set +H
orset +o histexpand
to disableset
example
-a
-o allexport
-b
cause the status of terminated background jobs to be reported immediately
-e
-o errexit
Exit immediately if a pipeline returns a non-zero status
-f
Disable filename expansion (globbing)
-h
-o hashall
-k
-o keyword
show on/off
$ set -o
$ set -o
allexport off
braceexpand on
emacs on
errexit off
errtrace off
functrace off
hashall on
histexpand on
history on
ignoreeof off
interactive-comments on
keyword off
monitor on
noclobber off
noexec off
noglob off
nolog off
notify off
nounset off
onecmd off
physical off
pipefail off
posix off
privileged off
verbose off
vi off
xtrace off
show +o/-o
$ set +o
$ set +o
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
set +o functrace
set -o hashall
set -o histexpand
set -o history
set +o ignoreeof
set -o interactive-comments
set +o keyword
set -o monitor
set +o noclobber
set +o noexec
set +o noglob
set +o nolog
set +o notify
set +o nounset
set +o onecmd
set +o physical
set +o pipefail
set +o posix
set +o privileged
set +o verbose
set +o vi
set +o xtrace
allexport
Same as -a
.
braceexpand
Same as -B
.
emacs
Use an emacs-style line editing interface.
This also affects the editing interface used for read -e
.
errexit
Same as -e
.
errtrace
Same as -E
.
functrace
Same as -T
.
[!TIP|label:tips:]
iMarslo : filename expansion check the shopt on/off (
set +o
)off
$ shopt -u extglob $ shopt extglob extglob off $ echo $? 1
on
$ shopt -s extglob $ shopt extglob extglob on $ echo $? 0
check without output via
-q
on
off
-s
enable ( [s]et )
-u
disable ( [u]nset )
-q
suppresses normal output
-o
set -o
assoc_expand_once
autocd
cdable_vars
cdspell
checkhash
checkjobs
checkwinsize
cmdhist
compat31
compat32
compat40
compat41
compat42
compat43
compat44
complete_fullquote
direxpand
dirspell
dotglob
-s
: *
will including all .*
execfail
expand_aliases
extdebug
extglob
extquote
failglob
-s
: show error msg and cmd not been exectued
force_fignore
globasciiranges
globstar
gnu_errfmt
histappend
histreedit
histverify
hostcomplete
huponexit
inherit_errexit
interactive_comments
lastpipe
lithist
localvar_inherit
localvar_unset
login_shell
mailwarn
no_empty_cmd_completion
nocaseglob
nocasematch
nullglob
progcomp
progcomp_alias
promptvars
restricted_shell
shift_verbose
sourcepath
xpg_echo
show all status
$ shopt | column -t
# or
$ shopt -p
$ shopt | column -t
autocd off
assoc_expand_once off
cdable_vars off
cdspell on
checkhash off
checkjobs off
checkwinsize on
cmdhist on
compat31 off
compat32 off
compat40 off
compat41 off
compat42 off
compat43 off
compat44 off
complete_fullquote on
direxpand off
dirspell off
dotglob off
execfail off
expand_aliases on
extdebug off
extglob on
extquote on
failglob off
force_fignore on
globasciiranges on
globskipdots on
globstar off
gnu_errfmt off
histappend on
histreedit off
histverify off
hostcomplete off
huponexit off
inherit_errexit off
interactive_comments on
lastpipe off
lithist off
localvar_inherit off
localvar_unset off
login_shell on
mailwarn off
no_empty_cmd_completion off
nocaseglob off
nocasematch off
noexpand_translation off
nullglob off
patsub_replacement on
progcomp on
progcomp_alias off
promptvars on
restricted_shell off
shift_verbose off
sourcepath on
varredir_close off
xpg_echo off
$ shopt -p
shopt -u autocd
shopt -u assoc_expand_once
shopt -u cdable_vars
shopt -s cdspell
shopt -u checkhash
shopt -u checkjobs
shopt -s checkwinsize
shopt -s cmdhist
shopt -u compat31
shopt -u compat32
shopt -u compat40
shopt -u compat41
shopt -u compat42
shopt -u compat43
shopt -u compat44
shopt -s complete_fullquote
shopt -u direxpand
shopt -u dirspell
shopt -u dotglob
shopt -u execfail
shopt -s expand_aliases
shopt -u extdebug
shopt -s extglob
shopt -s extquote
shopt -u failglob
shopt -s force_fignore
shopt -s globasciiranges
shopt -u globstar
shopt -u gnu_errfmt
shopt -s histappend
shopt -u histreedit
shopt -u histverify
shopt -u hostcomplete
shopt -u huponexit
shopt -u inherit_errexit
shopt -s interactive_comments
shopt -u lastpipe
shopt -u lithist
shopt -u localvar_inherit
shopt -u localvar_unset
shopt -s login_shell
shopt -u mailwarn
shopt -u no_empty_cmd_completion
shopt -u nocaseglob
shopt -u nocasematch
shopt -u nullglob
shopt -s progcomp
shopt -u progcomp_alias
shopt -s promptvars
shopt -u restricted_shell
shopt -u shift_verbose
shopt -s sourcepath
shopt -u xpg_echo
show single option
# shopt -s sourcepath
$ shopt -q sourcepath; echo $?
0
# shopt -u xpg_echo
$ shopt -q xpg_echo; echo $?
1
save terminal commands in bash history in real time
$ shopt -s histappend ; PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
[!NOTE|label:references:]
\C-
control prefix
\M-
meta prefix
\e
an escape character
\\
backslash
\"
", a double quotation mark
\'
', a single quote or apostrophe
more samples
"\e[11~"
:ESC [ 1 1 ~โ
: "Function Key 1"keyname
Control-u: universal-argument Meta-Rubout: backward-kill-word Control-o: "> output"
keyseq
alt-.
-
last arg from previous command
alt-d
^[dw
delete the next word on the line
alt-backspace
^[db
delete backwards one word
ctrl-w
^[dT
[!NOTE]
$ cat .inputrc
set editing-mode vi
set keymap vi
# or
$ set -o vi
[!TIP|label:references:]
#=============================================================================
# FileName : .inputrc
# Author : marslo.jiao@gmail.com
# Created : 2020-08-25 15:22:56
# LastChange : 2024-01-13 21:08:28
#=============================================================================
# [GNU Readline Library](https://tiswww.case.edu/php/chet/readline/rluserman.html)
# [PS1](https://github.com/marslo/mylinux/blob/master/confs/home/.marslo/.env#L209)
# set the mode string and cursor to indicate the vim mode
# - cursor shape: `\1\e[<number> q\2` ( i.e.: `\1\e[4 q\2` )
# - cursor shape+color: `\1\e[<nubmer> q\e]12;<color>\a\2` ( i.e.: `\1\e[1 q\e]12;orange\a\2` )
# 0: blinking block
# 1: blinking block (default)
# 2: steady block
# 3: blinking underline
# 4: steady underline
# 5: blinking bar (xterm)
# 6: steady bar (xterm)
# string settings cursor shape
# +------------------------------++--------+
# color begin color end
# +------------+ +---+
set emacs-mode-string "\1\e[38;5;240;1m\2โฐโถ แ \1\e[0m\2\1\e[3 q\2"
# string settings cursor shape
# +------------------------------------------++--------+
# color begin color begin color end
# +------------+ +------+ +---+
set vi-ins-mode-string "\1\e[38;5;240;1m\2โฐโถ \1\e[33;1m\2แ \1\e[0m\2\1\e[5 q\2"
set vi-cmd-mode-string "\1\e[38;5;240;1m\2โฐโถ \1\e[34;1m\2แ \1\e[0m\2\1\e[4 q\2"
set show-mode-in-prompt on
# allow iso-latin1 characters to be inserted
set convert-meta off
# don't strip characters to 7 bits when reading
set input-meta on
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
set mark-symlinked-directories on
set print-completions-horizontally on
# https://github.com/scop/bash-completion
set visible-stats on
set enable-bracketed-paste off
# https://groups.google.com/g/iterm2-discuss/c/K6YazwKUvjQ/m/7eqeT-AvBgAJ
# TAB: menu-complete
# set colored-completion-prefix on
set colored-stats on
set skip-completed-text on
# ask if more than 100 candidates
# set completion-query-items 100
set keymap emacs
"\ee": vi-editing-mode
# https://www.usenix.org.uk/content/bash.html#input
set keymap vi-command
"\ee": emacs-editing-mode
# key bindings to get out of vi-editing-mode
"v" : ''
"#": insert-comment
"dw": kill-word
"dd": kill-whole-line
"db": backward-kill-word
"D":kill-line
"da\"": "lF\"df\""
"di\"": "lF\"lmtf\"d`t"
"ci\"": "di\"i"
"da'": "lF'df'"
"di'": "lF'lmtf'd`t"
"ci'": "di'i"
"da`": "lF\`df\`"
"di`": "lF\`lmtf\`d`t"
"ci`": "di`i"
"ca`": "da`i"
"da(": "lF(df)"
"di(": "lF(lmtf)d`t"
"ci(": "di(i"
"ca(": "da(i"
"da)": "lF(df)"
"di)": "lF(lmtf)d`t"
"ci)": "di(i"
"ca)": "da(i"
"da{": "lF{df}"
"di{": "lF{lmtf}d`t"
"ci{": "di{i"
"ca{": "da{i"
"da}": "lF{df}"
"di}": "lF{lmtf}d`t"
"ci}": "di}i"
"ca}": "da}i"
"da[": "lF[df]"
"di[": "lF[lmtf]d`t"
"ci[": "di[i"
"ca[": "da[i"
"da]": "lF[df]"
"di]": "lF[lmtf]d`t"
"ci]": "di]i"
"ca]": "da]i"
"da<": "lF<df>"
"di<": "lF<lmtf>d`t"
"ci<": "di<i"
"ca<": "da<i"
"da>": "lF<df>"
"di>": "lF<lmtf>d`t"
"ci>": "di>i"
"ca>": "da>i"
"da/": "lF/df/"
"di/": "lF/lmtf/d`t"
"ci/": "di/i"
"ca/": "da/i"
"da:": "lF:df:"
"di:": "lF:lmtf:d`t"
"ci:": "di:i"
"ca:": "da:i"
"\C-_": undo
"\C-a": beginning-of-line
"\C-b": backward-char
"\C-d": delete-char
"\C-e": end-of-line
"\C-f": forward-char
"\C-g": abort
"\C-k": kill-line
"\C-l": clear-screen
"\C-p": previous-history
"\C-n": next-history
"\C-w": unix-word-rubout
"\C-q": quoted-insert
"\C-x\C-r": re-read-init-file
"\e#": insert-comment
"\e.": insert-last-argument
"\e.": yank-last-arg
set keymap vi-insert
"\ee": emacs-editing-mode
"\C-_": undo
"\C-a": beginning-of-line
"\C-b": backward-char
"\C-d": delete-char
"\C-e": end-of-line
"\C-f": forward-char
"\C-g": abort
"\C-k": kill-line
"\C-l": clear-screen
"\C-p": previous-history
"\C-n": next-history
"\C-w": unix-word-rubout
"\C-q": quoted-insert
"\C-x\C-r": re-read-init-file
"\e#": insert-comment
"\e.": insert-last-argument
"\e.": yank-last-arg
[!NOTE|label๐ถ] This is a patched version of bash
4.3.48
that adds support for custom prompt mode indicators. It also adds support for a\m
prompt escape to specify where in the prompt the indicator should occur.
0
blinking block
1
blinking block (default)
2
steady block
3
blinking underline
4
steady underline
5
blinking bar (xterm)
[!NOTE|label:references:]
set emacs-mode-string \1\e[4 q\e]12;red\a\2
set vi-ins-mode-string \1\e[5 q\e]12;green\a\2
set vi-cmd-mode-string \1\e[4 q\e]12;orange\a\2
# or
set emacs-mode-string "\1\e[3 q\2"
set vi-ins-mode-string "\1\e[5 q\2"
set vi-cmd-mode-string "\1\e[4 q\2"
PS1
[!NOTE|label:see also:]
PS1='\n\[\033[1m\]\[\033[38;5;240m\]โญโถ (\u@\h\[\033[1m\] '
PS1+='\[\033[0;31m\]\w\[\033[1m\]\[\033[38;5;240m\]) '
PS1+='$(__git_ps1 "- (\[\033[32;2m\]%s\[\033[0m\]\[\033[38;5;240m\]) ")\[\033[1m\]'
PS1+='\[\033[38;5;240m\]`if [ $? = 0 ]; then echo \[\033[38\;5\;240m\]\-\>; else echo \[\033[0\;31m\]\-\>; fi`\[\033[1m\]'
PS1+='\n\[\033[38;5;240m\] $ \[\033[1m\]\[\033[0m\]'
export PS1
inputrc
set show-mode-in-prompt on
# string settings cursor shape
# +------------------------------++--------+
# color begin color end
# +------------+ +---+
set emacs-mode-string "\1\e[38;5;240;1m\2โฐโถ แ \1\e[0m\2\1\e[3 q\2"
# string settings cursor shape
# +------------------------------------------++--------+
# color begin color begin color end
# +------------+ +------+ +---+
set vi-ins-mode-string "\1\e[38;5;240;1m\2โฐโถ \1\e[33;1m\2แ \1\e[0m\2\1\e[5 q\2"
set vi-cmd-mode-string "\1\e[38;5;240;1m\2โฐโถ \1\e[34;1m\2แ \1\e[0m\2\1\e[4 q\2"
set keymap emacs
"\ee": vi-editing-mode
set keymap vi-command
"\ee": emacs-editing-mode
set keymap vi-insert
"\ee": vi-movement-mode
$ export PS1=" โ๏คฟ \[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \w \\$ \n "
$ bind 'set show-mode-in-prompt on'
$ bind 'set vi-ins-mode-string " โโโ๏คฟ (ins):"'
$ bind 'set vi-cmd-mode-string " โโโ๏คฟ (cmd):"'
#################### VIM ####################
# FOR MORE INFORMATION CHECK:
# https://wiki.archlinux.org/index.php/Readline
# TURN ON VIM (E.G. FOR READLINE)
set editing-mode vi
# SHOW THE VIM MODE IN THE PROMPT (COMMAND OR INSERT)
set show-mode-in-prompt on
# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE
# FOR THE NUMBER AFTER `\e[`:
# 0: blinking block
# 1: blinking block (default)
# 2: steady block
# 3: blinking underline
# 4: steady underline
# 5: blinking bar (xterm)
# 6: steady bar (xterm)
set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2
$ cat ~/.inputrc
set editing-mode vi
set vi-ins-mode-string \1\e[5 q\e]12;green\a\2
set vi-cmd-mode-string \1\e[1 q\e]12;orange\a\2
set show-mode-in-prompt on
# display readline variable names and values can be used as input or in a Readline initialization file
$ bind -v
# list current readline variable names and values
$ bind -v
set bind-tty-special-chars on
set blink-matching-paren off
set byte-oriented off
set colored-completion-prefix off
set colored-stats on
set completion-ignore-case on
set completion-map-case off
set convert-meta off
set disable-completion off
set echo-control-characters on
set enable-active-region off
set enable-bracketed-paste off
set enable-keypad off
set enable-meta-key on
set expand-tilde off
set history-preserve-point off
set horizontal-scroll-mode off
set input-meta on
set mark-directories on
set mark-modified-lines off
set mark-symlinked-directories on
set match-hidden-files on
set menu-complete-display-prefix off
set meta-flag on
set output-meta on
set page-completions on
set prefer-visible-bell on
set print-completions-horizontally on
set revert-all-at-newline off
set show-all-if-ambiguous on
set show-all-if-unmodified on
set show-mode-in-prompt on
set skip-completed-text on
set visible-stats on
set bell-style audible
set comment-begin #
set completion-display-width -1
set completion-prefix-display-length 0
set completion-query-items 100
set editing-mode emacs
set emacs-mode-string โฐโถ แ
set history-size 5000
set keymap emacs
set keyseq-timeout 500
set vi-cmd-mode-string โฐโถ แ
set vi-ins-mode-string โฐโถ แ
options
active-region-start-color
active-region-end-color
bell-style
bind-tty-special-chars
blink-matching-paren
colored-completion-prefix
colored-stats
comment-begin
completion-display-width
completion-ignore-case
completion-map-case
completion-prefix-display-length
completion-query-items
convert-meta
disable-completion
echo-control-characters
editing-mode
emacs-mode-string
enable-active-region
enable-bracketed-paste
enable-keypad
enable-meta-key
expand-tilde
history-preserve-point
history-size
horizontal-scroll-mode
input-meta
isearch-terminators
keymap
keyseq-timeout
mark-directories
mark-modified-lines
mark-symlinked-directories
match-hidden-files
menu-complete-display-prefix
output-meta
page-completions
print-completions-horizontally
revert-all-at-newline
show-all-if-ambiguous
show-all-if-unmodified
show-mode-in-prompt
skip-completed-text
vi-cmd-mode-string
vi-ins-mode-string
visible-stats
# display readline function names and bindings can be used as input or in a readline initialization file
$ bind -p
# list current readline function names and bindings
$ bind -P
## query
$ bind -p
...
"\e&": tilde-expand
# vi-tilde-expand (not bound)
....
$ bind -q tilde-expand
tilde-expand can be invoked via "\e&".
$ bind -l
inputrc
# https://www.gnu.org/software/bash/manual/bash.html#index-show_002dmode_002din_002dprompt
set show-mode-in-prompt on
# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE
# FOR THE NUMBER AFTER `\e[`:
# 0: blinking block
# 1: blinking block (default)
# 2: steady block
# 3: blinking underline
# 4: steady underline
# 5: blinking bar (xterm)
# 6: steady bar (xterm)
set emacs-mode-string โฐโถ แ
set vi-ins-mode-string โฐโถ แ
set vi-cmd-mode-string โฐโถ แ
set emacs-mode-string \1\e[38;5;240;1m\2โฐโถ แ \1\e[0m\2
set vi-ins-mode-string \1\e[38;5;240;1m\2โฐโถ \1\e[33;1m\2แ \1\e[0m\2
set vi-cmd-mode-string \1\e[38;5;240;1m\2โฐโถ \1\e[34;1m\2แ \1\e[0m\2
# allow iso-latin1 characters to be inserted
set convert-meta off
# don't strip characters to 7 bits when reading
set input-meta on
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
set mark-symlinked-directories on
set print-completions-horizontally on
# https://github.com/scop/bash-completion
set visible-stats on
# https://groups.google.com/g/iterm2-discuss/c/K6YazwKUvjQ/m/7eqeT-AvBgAJ
set enable-bracketed-paste off
# TAB: menu-complete
# set colored-completion-prefix on
set colored-stats on
set skip-completed-text on
# ask if more than 100 candidates
# set completion-query-items 100
set keymap emacs
"\ee": vi-editing-mode
set keymap vi-command
"\ee": emacs-editing-mode
"dw": kill-word
"dd": kill-whole-line
"db": backward-kill-word
"D":kill-line
"v" : ''
"\C-_": undo
"\C-a": beginning-of-line
"\C-b": backward-char
"\C-d": delete-char
"\C-e": end-of-line
"\C-f": forward-char
"\C-g": abort
"\C-k": kill-line
"\C-l": clear-screen
"\C-p": previous-history
"\C-n": next-history
"\C-w": unix-word-rubout
"\C-q": quoted-insert
"\C-x\C-r": re-read-init-file
"\e#": insert-comment
"\e.": insert-last-argument
"\e.": yank-last-arg
# key bindings to get out of vi-editing-mode
set keymap vi-insert
"\ee": emacs-editing-mode
"\C-_": undo
"\C-a": beginning-of-line
"\C-b": backward-char
"\C-d": delete-char
"\C-e": end-of-line
"\C-f": forward-char
"\C-g": abort
"\C-k": kill-line
"\C-l": clear-screen
"\C-p": previous-history
"\C-n": next-history
"\C-w": unix-word-rubout
"\C-q": quoted-insert
"\C-x\C-r": re-read-init-file
"\e#": insert-comment
"\e.": insert-last-argument
"\e.": yank-last-arg
# https://www.gnu.org/software/bash/manual/bash.html#index-show_002dmode_002din_002dprompt
set show-mode-in-prompt on
# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE
# FOR THE NUMBER AFTER `\e[`:
# 0: blinking block
# 1: blinking block (default)
# 2: steady block
# 3: blinking underline
# 4: steady underline
# 5: blinking bar (xterm)
# 6: steady bar (xterm)
set emacs-mode-string โฐโถ แ
set vi-ins-mode-string โฐโถ แ
set vi-cmd-mode-string โฐโถ แ
set emacs-mode-string \1\e[38;5;240;1m\2โฐโถ แ \1\e[0m\2
set vi-ins-mode-string \1\e[38;5;240;1m\2โฐโถ \1\e[33;1m\2แ \1\e[0m\2
set vi-cmd-mode-string \1\e[38;5;240;1m\2โฐโถ \1\e[34;1m\2แ \1\e[0m\2
####################
# \e : Meta #
# \C : Control #
####################
# allow iso-latin1 characters to be inserted
set convert-meta off
# don't strip characters to 7 bits when reading
set input-meta on
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
set mark-symlinked-directories on
set print-completions-horizontally on
# https://github.com/scop/bash-completion
set visible-stats on
# https://groups.google.com/g/iterm2-discuss/c/K6YazwKUvjQ/m/7eqeT-AvBgAJ
set enable-bracketed-paste off
# TAB: menu-complete
# set colored-completion-prefix on
set colored-stats on
set skip-completed-text on
# ask if more than 100 candidates
# set completion-query-items 100
set keymap emacs
"\ee": vi-editing-mode
set keymap vi-command
"\ee": emacs-editing-mode
# key bindings to get out of vi-editing-mode
set keymap vi-insert
"\ee": vi-movement-mode
##### emacs #####
$if mode=emacs
"\ee": vi-editing-mode # `Esc-e`:vi-insert. https://unix.stackexchange.com/a/409866/29178
# "\e\e": vi-movement-mode
"\e~": complete-username
"\e_": yank-last-arg
"\e?": possible-completions
Meta-Control-h: backward-kill-word
$endif
##### vi #####
$if mode=vi
"\ee": emacs-editing-mode
$endif
##### command mode #####
$if mode=vi-command
"\ee": emacs-editing-mode
v: ""
Control-a: beginning-of-line
Control-b: backward-char
Control-d: delete-char
Control-e: end-of-line
Control-f: forward-char
Control-k: kill-line
Control-n: next-history
Control-p: previous-history
$endif
##### insert mode #####
$if mode=vi-insert
"\ee": emacs-editing-mode
"\C-k": kill-line
"\C-u": unix-line-discard
"\C-p": previous-history
"\C-n": next-history
"\C-a": beginning-of-line
"\C-e": end-of-line
"\C-f": forward-char
"\C-b": backward-char
"\C-l": clear-screen
"\C-d": delete-char
"\C-h": backward-delete-char
"\C-w": unix-word-rubout
"\et": transpose-words
"\ef": forward-word
"\eb": backward-word
"\ed": kill-word
"\e.":yank-last-arg
"\e_": yank-last-arg
"\C-_": undo
$endif
$if Bash
# edit the path
"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
$ cat ~/.inputrc
set convert-meta off # allow iso-latin1 characters to be inserted
set input-meta on # don't strip characters to 7 bits when reading
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
set mark-symlinked-directories on
set print-completions-horizontally on
set enable-bracketed-paste off # https://groups.google.com/g/iterm2-discuss/c/K6YazwKUvjQ/m/7eqeT-AvBgAJ
# set show-mode-in-prompt on
# TAB: menu-complete
# set colored-completion-prefix on
# set colored-stats on
set skip-completed-text on
# set completion-query-items 100 # ask if more than 100 candidates
# https://unix.stackexchange.com/a/409866/29178
set keymap emacs
$if mode=emacs
"\ee": vi-editing-mode
$endif
set keymap vi-insert
$if mode=vi-insert
"\e": vi-movement-mode
# "jk": vi-movement-mode
# "kj": vi-movement-mode
$endif
# set editing-mode vi
# command mode
set keymap vi-command
$if mode=vi-command
"\ee": emacs-editing-mode
v: ""
Control-a: beginning-of-line
Control-b: backward-char
Control-d: delete-char
Control-e: end-of-line
Control-f: forward-char
Control-k: kill-line
Control-n: next-history
Control-p: previous-history
$endif
# insert mode
set keymap vi-insert
$if mode=vi-insert
"\C-k": kill-line
"\C-u": unix-line-discard
"\C-p": previous-history
"\C-n": next-history
"\C-a": beginning-of-line
"\C-e": end-of-line
"\C-f": forward-char
"\C-b": backward-char
"\C-l": clear-screen
"\C-d": delete-char
"\C-h": backward-delete-char
"\C-w": unix-word-rubout
"\et": transpose-words
"\ef": forward-word
"\eb": backward-word
"\ed": kill-word
"\e.":yank-last-arg
"\e_": yank-last-arg
"\C-_": undo
$endif
$ cat /etc/inputrc
# do not bell on tab-completion
#set bell-style none
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
# Completed names which are symbolic links to
# directories have a slash appended.
set mark-symlinked-directories on
$if mode=emacs
# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
# commented out keymappings for pgup/pgdown to reach begin/end of history
#"\e[5~": beginning-of-history
#"\e[6~": end-of-history
"\e[5~": history-search-backward
"\e[6~": history-search-forward
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# for rxvt
"\e[8~": end-of-line
"\eOc": forward-word
"\eOd": backward-word
# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif
[!NOTE]
# .bashrc
stty werase undef
# .inputrc
bind '"\C-w":kill-region'
How to move the cursor word by word in the OS X Terminal
$ bind -q backward-word
backward-word can be invoked via "\M-b".
$ bind -q forward-word
forward-word can be invoked via "\M-f".
$ bind -q re-read-init-file
re-read-init-file can be invoked via "\C-x\C-r".
# or https://unix.stackexchange.com/a/246422/29178
$ bind -f ~/.inputrc
glob-list-expansions
$ bind -q glob-list-expansions
glob-list-expansions can be invoked via "\C-xg"
upcase-word
&& downcase-word
&& capitalize-word
[!NOTE|label:references:]
-a <FILE>
True if exists. (* not recommended, may collide with -a
for AND
)
-e <FILE>
True if exists.
-f <FILE>
True, if exists and is a regular file.
-d <FILE>
True, if exists and is a directory.
-c <FILE>
True, if exists and is a character special file.
-b <FILE>
True, if exists and is a block special file.
set -H
or set -o histexpand
to enablemore via $ man bash | less -Ip 'Event Designators'
$ bash -c "${foo}"
$ x=10
$ y=x
$ foo='$'$x
$ echo $foo
$x
# with eval
$ eval foo='$'$x # with eval
$ echo $foo
10
# or
$ foo=\$$x
$ eval echo $foo # with eval
10
$ echo $foo
$x
${BASH_ARGC[@]}
Number of arguments received by each function in the call stack
set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument โฆ]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument โฆ]
$ set | grep -e SHELLOPTS -e BASHOPTS
BASHOPTS=cdspell:checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
-m
-o monitor
-n
-o noexec
-o option-name
see option name
-p
-o privileged
the $BASH_ENV
and $ENV
files are not processed
-t
-o onecmd
-u
-o unset
treat unset variables and parameters other than the special parameters '@' or '*' as an error
-v
verbose. print shell input lines as they are read
-x
-o xtrace
[debug] print commands and their arguments as they are executed
-B
-o braceexpand
shell will perform brace expansion
-c
-o noclobber
prevent output redirection using '>', '>&', and '<>' from overwriting existing files.
-E
-o errtrace
-H
-o histexpand
-P
do not resolve symbolic links
-T
-o functrace
any trap on DEBUG
and RETURN
are inherited by shell functions
--
if no arguments follow this option, then the positional parameters are unset
-
signal the end of options, cause all remaining arguments to be assigned to the positional parameters
hashall
Same as -h
.
histexpand
Same as -H
.
history
Enable command history, as described in Bash History Facilities. This option is on by default in interactive shells.
ignoreeof
An interactive shell will not exit upon reading EOF.
keyword
Same as -k
.
monitor
Same as -m
.
noclobber
Same as -C
.
noexec
Same as -n
.
noglob
Same as -f
.
nolog
Currently ignored.
notify
Same as -b
.
nounset
Same as -u
.
onecmd
Same as -t
.
physical
Same as -P
.
pipefail
If set, the return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands in the pipeline exit successfully. This option is disabled by default.
posix
Change the behavior of Bash where the default operation differs from the POSIX standard to match the standard (see Bash POSIX Mode). This is intended to make Bash behave as a strict superset of that standard.
privileged
Same as -p
.
verbose
Same as -v
.
vi
Use a vi-style line editing interface. This also affects the editing interface used for read -e
.
xtrace
Same as -x
.
$ set | grep -e SHELLOPTS -e BASHOPTS
# for shopt
BASHOPTS=cdspell:checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
# for set
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
$ set -o | column -t | grep -v off
braceexpand on
emacs on
hashall on
histexpand on
history on
interactive-comments on
monitor on
$ shopt | column -t | grep -v off
cdspell on
checkwinsize on
cmdhist on
complete_fullquote on
expand_aliases on
extglob on
extquote on
force_fignore on
globasciiranges on
histappend on
interactive_comments on
login_shell on
progcomp on
promptvars on
sourcepath on
$ shopt -q extglob; echo $?
0
$ shopt -q failglob; echo $?
1
\a
alert (bell)
\b
backspace
\d
delete
\f
form feed
newline
carriage return
horizontal tab
\v
vertical tab
\nnn
octal value
\xHH
hexadecimal value
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": "Function Key 1"
delete backwards a whole word until white space/punctuation
ctrl-k
^[D
delete from the cursor to the end of the line
ctrl-u
^[d^
delete from the cursor to the start of the line
alt-f
^[E
move to the end of the word
alt-b
^[w
move to the start of the word
ctrl-e
^[$
move to the very end of the line
ctrl-a
^[^
move to the very start of the line
Acceptable keymap names are emacs, emacs-standard, emacs-meta, emacs-ctlx,
vi, vi-move, vi-command, and vi-insert.
vi is equivalent to vi-command; emacs is equivalent to emacs-standard.
6
steady bar (xterm)
# Set the default readline mode as vi
set editing-mode vi
# Show the vi mode indicators
set show-mode-in-prompt on
# The following is a little hard to understand
# a full example omiting the wrapping \1 and \2
#
# \e[ (open sequence: ESC CSI)
# 48;5; (specifies 256 bg)
# 2 (bg color)
# m (end)
# 1; (bold)
# 38;5; (specifies 256 fg)
# 0 (fg color)
# m (end)
# COMMAND (some text to display)
# \e[ (open sequence)
# 0 (reset)
# m (end)
# \e[ (open sequence)
# 0 (cursor type)
# q (end)
# Configures the cmd mode display
set vi-cmd-mode-string "\1\e[48;5;2m\2\1\e[1;38;5;0m\2 N \1\e[0m\2 \1\e[0 q\2"
# Configures the ins mode display
set vi-ins-mode-string "\1\e[48;5;4m\2\1\e[1;38;5;0m\2 I \1\e[0m\2 \1\e[6 q\2"
$ bind -q insert-comment
insert-comment can be invoked via "\e#".
$ bind -q insert-last-argument
insert-last-argument can be invoked via "\e.", "\e_".
$ bind -q upcase-word
upcase-word can be invoked via "\eu".
$ bind -q downcase-word
downcase-word can be invoked via "\el"
$ bind -q capitalize-word
capitalize-word can be invoked via "\ec".
set editing-mode vi
set show-mode-in-prompt on
set vi-ins-mode-string \1\e[6 q\2
set vi-cmd-mode-string \1\e[2 q\2
# optionally:
# switch to block cursor before executing a command
set keymap vi-insert
RETURN: "\e\n"
$ bind -q undo
undo can be invoked via "\C-x\C-u", "\C-_".
$ bind -q shell-expand-line
shell-expand-line can be invoked via "\M-\C-e".
$ bind -q display-shell-version
display-shell-version can be invoked via "\C-x\C-v".
-p <FILE>
True, if exists and is a named pipe (FIFO).
-S <FILE>
True, if exists and is a socket file.
-L <FILE>
True, if exists and is a symbolic link.
-h <FILE>
True, if exists and is a symbolic link.
-g <FILE>
True, if exists and has sgid bit set.
-u <FILE>
True, if exists and has suid bit set.
-r <FILE>
True, if exists and is readable.
-w <FILE>
True, if exists and is writable.
-x <FILE>
True, if exists and is executable.
-s <FILE>
True, if exists and has size bigger than 0 (not empty).
-t <fd>
True, if file descriptor is open and refers to a terminal.
<FILE1> -nt <FILE2>
True, if is newer than (mtime).
<FILE1> -ot <FILE2>
True, if is older than (mtime).
<FILE1> -ef <FILE2>
True, if and refer to the same device and inode numbers.