Skip to content
Mark Vander Stel edited this page Dec 10, 2020 · 16 revisions

WIP

IFS

Always set a local IFS when doing something that references it. Never assume that the user or Liquidprompt has a sane IFS set.

If running a for loop on the output of a command, like

for temp in $(sensors -u); do
  ...

you should set a local beforehand like local IFS=$'\n'.

If using read to read data from a file or command, set IFS as part of the read command:

IFS= read var <myfile
IFS=" " read var1 var2 var3 <<<"1 2 3"

Quoting

When in doubt, always quote a shell variable ("$var").

Special shell variables like $? and $- are treated no differently by the shell, they must also be quoted.

There are two cases where quoting is optional:

  1. When setting a variable: var=$other_var. When setting a variable to something other than one variable, use quotes for clarity: var="${var1}${var2}".
  2. When referencing a variable in a [[ ... ]] block.

Both of these exceptions are not exceptions if the string you are building contains whitespace:

var=$myvar $othervar    # does not work
var="$myvar $othervar"  # fixed

[[ $var $othervar == one two ]]      # does not work
[[ "$var $othervar" == "one two" ]]  # fixed

Zsh special variables

Zsh has a handful of variables that are "special", and do not play well with being declared as local. Always avoid naming any variables these (IFS being the exception, see above):

% for p in $parameters[(I)*]; do print $p $parameters[$p]; done | grep special | sort
$ integer-readonly-special
0 scalar-special
aliases association-hide-hideval-special
ARGC integer-readonly-special
argv array-special
* array-readonly-special
@ array-readonly-special
builtins association-readonly-hide-hideval-special
cdpath array-special
CDPATH scalar-special
COLUMNS integer-special
commands association-hide-hideval-special
dirstack array-hide-hideval-special
dis_aliases association-hide-hideval-special
dis_builtins association-readonly-hide-hideval-special
dis_functions association-hide-hideval-special
dis_galiases association-hide-hideval-special
dis_patchars array-readonly-hide-hideval-special
dis_reswords array-readonly-hide-hideval-special
dis_saliases association-hide-hideval-special
EGID integer-special
EUID integer-special
fignore array-special
FIGNORE scalar-special
fpath array-special
FPATH scalar-special
funcfiletrace array-readonly-hide-hideval-special
FUNCNEST integer-special
funcsourcetrace array-readonly-hide-hideval-special
funcstack array-readonly-hide-hideval-special
functions association-hide-hideval-special
functrace array-readonly-hide-hideval-special
galiases association-hide-hideval-special
GID integer-special
histchars scalar-special
HISTCHARS scalar-special
HISTCMD integer-readonly-special
history association-readonly-hide-hideval-special
historywords array-readonly-hide-hideval-special
HISTSIZE integer-export-special
HOME scalar-export-special
IFS scalar-special
! integer-readonly-special
# integer-readonly-special
? integer-readonly-special
jobdirs association-readonly-hide-hideval-special
jobstates association-readonly-hide-hideval-special
jobtexts association-readonly-hide-hideval-special
KEYBOARD_HACK scalar-special
keymaps array-readonly-hide-hideval-special
LANG scalar-export-special
LINENO integer-readonly-special
LINES integer-special
mailpath array-special
MAILPATH scalar-special
manpath array-special
MANPATH scalar-special
module_path array-special
MODULE_PATH scalar-special
modules association-readonly-hide-hideval-special
nameddirs association-hide-hideval-special
NULLCMD scalar-special
OPTARG scalar-special
OPTIND integer-special
options association-hide-hideval-special
parameters association-readonly-hide-hideval-special
patchars array-readonly-hide-hideval-special
path array-special
PATH scalar-export-special
pipestatus array-special
PPID integer-readonly-special
PROMPT2 scalar-special
PROMPT3 scalar-special
PROMPT4 scalar-special
prompt scalar-special
PROMPT scalar-special
PS1 scalar-export-special
PS2 scalar-special
PS3 scalar-special
PS4 scalar-special
psvar array-special
PSVAR scalar-special
RANDOM integer-special
READNULLCMD scalar-special
reswords array-readonly-hide-hideval-special
saliases association-hide-hideval-special
SAVEHIST integer-special
scalar-readonly-special
_ scalar-special
SECONDS integer-special
SHLVL integer-export-special
SPROMPT scalar-special
status integer-readonly-special
termcap association-readonly-hide-hideval-special
terminfo association-readonly-hide-hideval-special
TERM scalar-export-special
TRY_BLOCK_ERROR integer-special
TRY_BLOCK_INTERRUPT integer-special
TTYIDLE integer-readonly-special
UID integer-special
userdirs association-readonly-hide-hideval-special
USERNAME scalar-special
watch array-special
WATCH scalar-special
widgets association-readonly-hide-hideval-special
WORDCHARS scalar-special
zsh_eval_context array-readonly-special
ZSH_EVAL_CONTEXT scalar-readonly-special
zsh_scheduled_events array-readonly-hide-hideval-special
ZSH_SUBSHELL integer-readonly-special
Clone this wiki locally