bash
Wstęp
edytuj- powłoka ( ang. shell)
- subshell[1]
odmiany
edytuj- POSIX shell (sh)
- Bourne shell (sh)
- Korn shell (ksh)
- Bourne Again shell (bash)
- Z shell (zsh)
- Debian Almquist shell (dash)
Dokumentacja
edytujPomoc:
- online
- offline
Za pomocą polecenia:[2]
man bash
uzyskamy wersję dokumentacji:
- aktualną (odpowiednią dla zainstalowanej wersji Basha)
- nie wymagającą dostępu do sieci (ang. offline)
Online:
- explainshell [3]
- dokumentacja w3cub[4]
- tldr ( TL;DR or TLDR stands for "Too Long; Didn't Read )
- explain shell
znaki
edytuj- [ = brackets[5]
- double brackets = [[
- ( = parenthesis
- (( = double parenthesis
Metaznaki
edytuj- ;
- &
- (
- )
- |
- <
- >
- nl (nowa linia)
- spacja (odstęp)
- TAB
- \ ( backslash)
Backslash
edytujMa dwa znaczenia
- zapobiega interpretacji następnego znaku (ang. escape character). Jest to jedna z 3 metod [8]
- pozwala na dzielenie długiego polecenia na kilka linii (ang. a line continuation character ). Składnia : <backslash><newline>
$ echo "continuation"\
> "lines"
continuation lines
Wyrażenie regularne
edytujwyrażenia regularne Bash ( Bash Regular Expressions = BRE)
Klasy znaków ( character classes) wyrażeń regularnych Bash ( Bash Regular Expressions = BRE)[9]
- [[:alpha:]] - matches any alphabetic character written in upper or lower case.
- [[:alnum:]]- matches any alphanumeric character - namely, the characters in the range 0-9, A-Z, a-z.
- [[:blank:]] - matches a space and a tab character.
- [[:digit:]]- any numeric character from 0to 9.
- [[:upper:]]- uppercase alphabetic characters - A-Z.
- [[:lower:]]- alphabetic characters in lower case - a-z.
- [[:print:]] - matches any printable character.
- [[:punct:]] - matches punctuation marks.
- [[:space:]]- whitespace, in particular - a space, a tab character, characters NL, FF, VT, CR.
wersja
edytujSprawdzamy wersję BASH'a:
/bin/bash --version GNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
lub:
dpkg -s bash | grep Version
wynik:
Version: 4.2-5ubuntu3
Bezpieczeństwo
edytujSprawdzamy czy nasza wersja jest nieodporna na CVE-2014-6271: [10]
env x='() { :;}; echo vulnerable' bash -c 'echo hello'
Argumenty
edytuj
Przekazywanie argumentów ( ang. command substitution)[11]
sudo apt install linux-headers-$(uname -r)
lub
$ sudo apt install linux-headers-'uname -r'
lokalizacja
edytuj- CLDR = The Unicode Common Locale Data Repository (CLDR) provides key building blocks for software to support the world's languages, with the largest and most extensive standard repository of locale data available
- Loclaes in glibc
Opcje
edytujOpcje Basha [12].
Dodanie flagi "-x" pozwala zobaczyć co dokładnie skrypt robi:
#!/bin/bash -x
Polecenie shopt drukuje ustawienia[13]
shopt -o
zmienne
edytujWymień wszystkie zadeklarowane zmienne, ich atrybuty i ich wartości
declare -p
Przykładowy wynik
declare -- BASH="/usr/bin/bash" declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:progcomp:promptvars:sourcepath" declare -i BASHPID declare -A BASH_ALIASES=() declare -a BASH_ARGC=([0]="0") declare -a BASH_ARGV=() declare -- BASH_ARGV0 declare -A BASH_CMDS=() declare -- BASH_COMMAND declare -a BASH_COMPLETION_VERSINFO=([0]="2" [1]="11") declare -a BASH_LINENO=() declare -a BASH_SOURCE=() declare -- BASH_SUBSHELL declare -ar BASH_VERSINFO=([0]="5" [1]="1" [2]="8" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") declare -- BASH_VERSION="5.1.8(1)-release" declare -x COLORTERM="truecolor" declare -- COLUMNS="282" declare -- COMP_WORDBREAKS declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus" declare -x DESKTOP_SESSION="ubuntu" declare -a DIRSTACK=() declare -x DISPLAY=":1" declare -- EPOCHREALTIME declare -- EPOCHSECONDS declare -ir EUID="1000" declare -a FUNCNAME declare -x GDMSESSION="ubuntu" declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated" declare -x GNOME_SHELL_SESSION_MODE="ubuntu" declare -x GNOME_TERMINAL_SCREEN="/org/gnome/Terminal/screen/0d475444_f264_4d18_b211_b17d05380607" declare -x GNOME_TERMINAL_SERVICE=":1.222" declare -x GPG_AGENT_INFO="/run/user/1000/gnupg/S.gpg-agent:0:1" declare -a GROUPS=() declare -x GTK_MODULES="gail:atk-bridge" declare -x G_ENABLE_DIAGNOSTIC="0" declare -i HISTCMD declare -- HISTCONTROL="ignoreboth" declare -- HISTFILE="/home/a/.bash_history" declare -- HISTFILESIZE="2000" declare -- HISTSIZE="1000" declare -x HOME="/home/a" declare -- HOSTNAME="zalman" declare -- HOSTTYPE="x86_64" declare -- IFS=" " declare -x IM_CONFIG_PHASE="1" declare -x INVOCATION_ID="bad815f656bd47a98d70b4503a7ac633" declare -x JOURNAL_STREAM="8:183513" declare -x LANG="pl_PL.UTF-8" declare -x LESSCLOSE="/usr/bin/lesspipe %s %s" declare -x LESSOPEN="| /usr/bin/lesspipe %s" declare -- LINENO declare -- LINES="75" declare -x LOGNAME="a" declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:" declare -- MACHTYPE="x86_64-pc-linux-gnu" declare -i MAILCHECK="60" declare -x MANAGERPID="1694" declare -x OLDPWD declare -- OPTERR="1" declare -i OPTIND="1" declare -- OSTYPE="linux-gnu" declare -x PATH="/home/a/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin" declare -a PIPESTATUS=([0]="0") declare -ir PPID="51393" declare -- PS1="\\[\\e]0;\\u@\\h: \\w\\a\\]\${debian_chroot:+(\$debian_chroot)}\\[\\033[01;32m\\]\\u@\\h\\[\\033[00m\\]:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\\$ " declare -- PS2="> " declare -- PS4="+ " declare -x PWD="/home/a/Dokumenty/mandelbrot_planes/temp/l0" declare -x QT_ACCESSIBILITY="1" declare -x QT_IM_MODULE="ibus" declare -i RANDOM declare -- SECONDS declare -x SESSION_MANAGER="local/zalman:@/tmp/.ICE-unix/1906,unix/zalman:/tmp/.ICE-unix/1906" declare -x SHELL="/bin/bash" declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" declare -x SHLVL="1" declare -i SRANDOM declare -x SSH_AGENT_LAUNCHER="gnome-keyring" declare -x SSH_AUTH_SOCK="/run/user/1000/keyring/ssh" declare -x SYSTEMD_EXEC_PID="51393" declare -x TERM="xterm-256color" declare -ir UID="1000" declare -x USER="a" declare -x USERNAME="a" declare -x VTE_VERSION="6402" declare -x WINDOWPATH="2" declare -x XAUTHORITY="/run/user/1000/gdm/Xauthority" declare -x XDG_CONFIG_DIRS="/etc/xdg/xdg-ubuntu:/etc/xdg" declare -x XDG_CURRENT_DESKTOP="ubuntu:GNOME" declare -x XDG_DATA_DIRS="/usr/share/ubuntu:/home/a/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop" declare -x XDG_MENU_PREFIX="gnome-" declare -x XDG_RUNTIME_DIR="/run/user/1000" declare -x XDG_SESSION_CLASS="user" declare -x XDG_SESSION_DESKTOP="ubuntu" declare -x XDG_SESSION_TYPE="x11" declare -x XMODIFIERS="@im=ibus" declare -- _="sorted_files" declare -- __git_printf_supports_v="yes" declare -- _backup_glob="@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))" declare -A _xspecs=([tex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [freeamp]="!*.@(mp3|og[ag]|pls|m3u)" [gqmpeg]="!*.@(mp3|og[ag]|pls|m3u)" [texi2html]="!*.texi*" [hbpp]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [rpm2cpio]="!*.[rs]pm" [localc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [hbrun]="!*.[Hh][Rr][Bb]" [vi]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [latex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [view]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [madplay]="!*.mp3" [compress]="*.Z" [pdfjadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [pbunzip2]="!*.?(t)bz?(2)" [lrunzip]="!*.lrz" [gunzip]="!*.@(Z|[gGd]z|t[ag]z)" [oowriter]="!*.@(sxw|stw|sxg|sgl|doc?([mx])|dot?([mx])|rtf|txt|htm|html|?(f)odt|ott|odm|pdf)" [epiphany]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [acroread]="!*.[pf]df" [znew]="*.Z" [kwrite]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [gview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [lzfgrep]="!*.@(tlz|lzma)" [lzless]="!*.@(tlz|lzma)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))" [zipinfo]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [pdflatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [portecle]="!@(*.@(ks|jks|jceks|p12|pfx|bks|ubr|gkr|cer|crt|cert|p7b|pkipath|pem|p10|csr|crl)|cacerts)" [modplugplay]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [lokalize]="!*.po" [lbzcat]="!*.?(t)bz?(2)" [qiv]="!*.@(gif|jp?(e)g|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|svg)" [totem]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [ps2pdfwr]="!*.@(?(e)ps|pdf)" [dvitype]="!*.dvi" [unpigz]="!*.@(Z|[gGdz]z|t[ag]z)" [mozilla]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [pdfunite]="!*.pdf" [gpdf]="!*.[pf]df" [texi2dvi]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [bunzip2]="!*.?(t)bz?(2)" [zathura]="!*.@(cb[rz7t]|djv?(u)|?(e)ps|pdf)" [kaffeine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [mpg123]="!*.mp3" [lzegrep]="!*.@(tlz|lzma)" [xv]="!*.@(gif|jp?(e)g?(2)|j2[ck]|jp[2f]|tif?(f)|png|p[bgp]m|bmp|x[bp]m|rle|rgb|pcx|fits|pm|?(e)ps)" [xdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [xfig]="!*.fig" [xpdf]="!*.@(pdf|fdf)?(.@(gz|GZ|bz2|BZ2|Z))" [oobase]="!*.odb" [xelatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gharbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [bzcat]="!*.?(t)bz?(2)" [dragon]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM|iso|ISO)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [xanim]="!*.@(mpg|mpeg|avi|mov|qt)" [lualatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [rgview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [xetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lomath]="!*.@(sxm|smf|mml|odf)" [zcat]="!*.@(Z|[gGd]z|t[ag]z)" [lynx]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [uncompress]="!*.Z" [xzcat]="!*.@(?(t)xz|tlz|lzma)" [vim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [loimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [dvipdf]="!*.dvi" [mpg321]="!*.mp3" [jadetex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [lobase]="!*.odb" [epdfview]="!*.pdf" [ps2pdf14]="!*.@(?(e)ps|pdf)" [ps2pdf13]="!*.@(?(e)ps|pdf)" [ps2pdf12]="!*.@(?(e)ps|pdf)" [poedit]="!*.po" [luatex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [kbabel]="!*.po" [bzme]="!*.@(zip|z|gz|tgz)" [dviselect]="!*.dvi" [realplay]="!*.@(rm?(j)|ra?(m)|smi?(l))" [kdvi]="!*.@(dvi|DVI)?(.@(gz|Z|bz2))" [elinks]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [kghostview]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [gtranslator]="!*.po" [unzip]="!*.@(zip|[aegjswx]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|aab|ipa|do[ct][xm]|p[op]t[mx]|xl[st][xm]|pyz|whl)" [ggv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [oomath]="!*.@(sxm|smf|mml|odf)" [dvipdfmx]="!*.dvi" [makeinfo]="!*.texi*" [okular]="!*.@(okular|@(?(e|x)ps|?(E|X)PS|[pf]df|[PF]DF|dvi|DVI|cb[rz]|CB[RZ]|djv?(u)|DJV?(U)|dvi|DVI|gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx|GIF|JP?(E)G|MIFF|TIF?(F)|PN[GM]|P[BGP]M|BMP|XPM|ICO|XWD|TGA|PCX|epub|EPUB|odt|ODT|fb?(2)|FB?(2)|mobi|MOBI|g3|G3|chm|CHM)?(.?(gz|GZ|bz2|BZ2|xz|XZ)))" [sxemacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [aviplay]="!*.@(avi|asf|wmv)" [rgvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [dvipdfm]="!*.dvi" [ly2dvi]="!*.ly" [oodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [kpdf]="!*.@(?(e)ps|pdf)" [bibtex]="!*.aux" [netscape]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [emacs]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [rview]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [galeon]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [dillo]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [fbxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [oocalc]="!*.@(sxc|stc|xls?([bmx])|xlw|xlt?([mx])|[ct]sv|?(f)ods|ots)" [harbour]="!*.@([Pp][Rr][Gg]|[Cc][Ll][Pp])" [lodraw]="!*.@(sxd|std|sda|sdd|?(f)odg|otg)" [dvips]="!*.dvi" [ps2pdf]="!*.@(?(e)ps|pdf)" [kate]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [kid3-qt]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [pdftex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [gvim]="*.@([ao]|so|so.!(conf|*/*)|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)" [timidity]="!*.@(mid?(i)|rmi|rcp|[gr]36|g18|mod|xm|it|x3m|s[3t]m|kar)" [ogg123]="!*.@(og[ag]|m3u|flac|spx)" [lzgrep]="!*.@(tlz|lzma)" [ee]="!*.@(gif|jp?(e)g|miff|tif?(f)|pn[gm]|p[bgp]m|bmp|xpm|ico|xwd|tga|pcx)" [unlzma]="!*.@(tlz|lzma)" [lbunzip2]="!*.?(t)bz?(2)" [ooimpress]="!*.@(sxi|sti|pps?(x)|ppt?([mx])|pot?([mx])|?(f)odp|otp)" [xine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [amaya]="!*.@(?([xX]|[sS])[hH][tT][mM]?([lL]))" [gv]="!*.@(@(?(e)ps|?(E)PS|pdf|PDF)?(.gz|.GZ|.bz2|.BZ2|.Z))" [kid3]="!*.@(mp[234c]|og[ag]|@(fl|a)ac|m4[abp]|spx|tta|w?(a)v|wma|aif?(f)|asf|ape)" [lilypond]="!*.ly" [modplug123]="!*.@(669|abc|am[fs]|d[bs]m|dmf|far|it|mdl|m[eo]d|mid?(i)|mt[2m]|oct|okt?(a)|p[st]m|s[3t]m|ult|umx|wav|xm)" [pbzcat]="!*.?(t)bz?(2)" [unxz]="!*.@(?(t)xz|tlz|lzma)" [playmidi]="!*.@(mid?(i)|cmf)" [lzcat]="!*.@(tlz|lzma)" [slitex]="!*.@(?(la)tex|texi|dtx|ins|ltx|dbj)" [aaxine]="!*@(.@(mp?(e)g|MP?(E)G|wm[av]|WM[AV]|avi|AVI|asf|vob|VOB|bin|dat|divx|DIVX|vcd|ps|pes|fli|flv|FLV|fxm|FXM|viv|rm|ram|yuv|mov|MOV|qt|QT|web[am]|WEB[AM]|mp[234]|MP[234]|m?(p)4[av]|M?(P)4[AV]|mkv|MKV|og[agmvx]|OG[AGMVX]|t[ps]|T[PS]|m2t?(s)|M2T?(S)|mts|MTS|wav|WAV|flac|FLAC|asx|ASX|mng|MNG|srt|m[eo]d|M[EO]D|s[3t]m|S[3T]M|it|IT|xm|XM)|+([0-9]).@(vdr|VDR))?(.@(crdownload|part))" [advi]="!*.dvi" [lzmore]="!*.@(tlz|lzma)" )
Zmienne środowiskowe
edytujWyświetlamy:
printenv
przykładowy wynik:
XDG_VTNR=7 SSH_AGENT_PID=1385 XDG_SESSION_ID=c1 GEDIT_CURRENT_DOCUMENT_TYPE=text/plain CLUTTER_IM_MODULE=xim SESSION=ubuntu GPG_AGENT_INFO=/run/user/1000/keyring-iaC4kY/gpg:0:1 TERM=xterm VTE_VERSION=3406 XDG_MENU_PREFIX=gnome- GEDIT_DOCUMENTS_PATH=/home/a/drop.sh /home/a/Pobrane/maximus-book/code/bin/mandelbrot_external_ray_out.c /home/a/Pobrane/maximus-book/code/README SHELL=/bin/bash GEDIT_CURRENT_LINE=text `echo "-0.75 0.01"| ./rescale 53 53 $view 0` -0.75+0.01i WINDOWID=71303676 UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/1295 GNOME_KEYRING_CONTROL=/run/user/1000/keyring-iaC4kY GTK_MODULES=overlay-scrollbar:unity-gtk-module GEDIT_CURRENT_DOCUMENT_SCHEME=file USER=a JRE_HOME=/usr/local/java/jre1.7.0_45 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0 XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 SSH_AUTH_SOCK=/run/user/1000/keyring-iaC4kY/ssh GEDIT_CURRENT_DOCUMENT_NAME=README SESSION_MANAGER=local/zalman:@/tmp/.ICE-unix/1437,unix/zalman:/tmp/.ICE-unix/1437 DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg GEDIT_CURRENT_WORD=i DESKTOP_SESSION=ubuntu PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/a/bin:/usr/local/java/jdk1.7.0_45/bin:/home/a/bin:/usr/local/java/jre1.7.0_45/bin GEDIT_CURRENT_DOCUMENT_DIR=/home/a/Pobrane/maximus-book/code PWD=/home/a/Pobrane/maximus-book/code JOB=dbus XMODIFIERS=@im=ibus JAVA_HOME=/usr/local/java/jdk1.7.0_45 LANG=pl_PL.UTF-8 GDM_LANG=pl MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path GEDIT_CURRENT_LINE_NUMBER=13 UBUNTU_MENUPROXY=1 COMPIZ_CONFIG_PROFILE=ubuntu IM_CONFIG_PHASE=1 GDMSESSION=ubuntu SESSIONTYPE=gnome-session SHLVL=1 HOME=/home/a XDG_SEAT=seat0 LANGUAGE=pl GEDIT_CURRENT_DOCUMENT_PATH=/home/a/Pobrane/maximus-book/code/README GEDIT_CWD=/home/a GNOME_DESKTOP_SESSION_ID=this-is-deprecated UPSTART_INSTANCE= UPSTART_EVENTS=started xsession LOGNAME=a COMPIZ_BIN_PATH=/usr/bin/ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-2xmczCQuFO XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/ QT4_IM_MODULE=xim LESSOPEN=| /usr/bin/lesspipe %s GEDIT_CURRENT_DOCUMENT_URI=file:///home/a/Pobrane/maximus-book/code/README INSTANCE= TEXTDOMAIN=im-config UPSTART_JOB=gnome-session XDG_RUNTIME_DIR=/run/user/1000 DISPLAY=:0.0 GEDIT_DOCUMENTS_URI=file:///home/a/drop.sh file:///home/a/Pobrane/maximus-book/code/bin/mandelbrot_external_ray_out.c file:///home/a/Pobrane/maximus-book/code/README XDG_CURRENT_DESKTOP=Unity GTK_IM_MODULE=ibus LESSCLOSE=/usr/bin/lesspipe %s %s TEXTDOMAINDIR=/usr/share/locale/ XAUTHORITY=/home/a/.Xauthority COLORTERM=gnome-terminal _=/usr/bin/printenv
Różne sposoby zmiany wartości:[16]
name=value export name=value name=value program env name=value program
EDITOR
edytujNie jest stałą zmienną[17], czasem jest używany odnośnik symboliczny. Sprawdzamy to:
which editor
przykładowy wynik:
/usr/bin/editor
Sprawdzamy efekt:
editor
i uruchamia się ...
IFS
edytujZmienna IFS (ang. Input Field Separators czyli Wewnętrzny separator pól)
Jest to wewnętrzna zmienna bash[18] używana do dzielenia słów ( ang. Word Splitting) po rozwinięciu i do dzielenia wierszy na słowa za pomocą wbudowanego polecenia read.
Wartość domyślna to
<spacja><tab><nowa linia>
Domyślną wartością IFS jest: spacja, tabulator i znak nowej linii.
Kiedy spróbujemy wyświetlić wartość IFS nie widzimy nic, ponieważ są to znaki specjalne.[19]
echo "$IFS"
Korzystając z opcji "tve" polecenia cat, możemy zobaczyć spację, po której następuje znak ^I, który jest znakiem tabulacji, a następnie znak nowej linii.
echo "$IFS" | cat -tve
^I$
$
Jeśli wartość IFS jest równa null, nie następuje dzielenie słów.
LANG
edytujWartość tej zmiennej ma wpływ na:
Sprawdzamy aktualną wartość:
echo $LANG pl_PL.UTF-8
Dopuszczale wartości znajdujemy za pomocą polecenia:[21][22]
locale -a
przykładowy wynik:
C C.UTF-8 en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZM en_ZM.utf8 en_ZW.utf8 pl_PL.utf8 POSIX
lub w pliku /usr/share/i18n/supported:[23]
# This file names the currently supported and somewhat tested locales. # If you have any additions please file a glibc bug report. aa_DJ.UTF-8 UTF-8 aa_DJ ISO-8859-1 aa_ER UTF-8 aa_ER@saaho UTF-8 aa_ET UTF-8 ... pap_AN UTF-8 pl_PL.UTF-8 UTF-8 pl_PL ISO-8859-2 ps_AF UTF-8 pt_BR.UTF-8 UTF-8 pt_BR ISO-8859-1 ...
Czasowa zmiana wartości:
export LANG=en_GB.utf8
LANG=en_us_8859_1
lub setlocale[24]
LC_NUMERIC
edytujSprawdzamy wartość:
locale | grep NUM LC_NUMERIC="pl_PL.UTF-8"
LIBRARY_PATH
edytujLD_LIBRARY_PATH to zmienna środowiskowa ( ang. environment variable), która zawiera listę katalogów, w których plik wykonywalny może wyszukiwać współdzieloną bibliotekę systemu Linux. Nazywa się to również ścieżką wyszukiwania bibliotek udostępnionych.[26]
Wartość zmiennej środowiskowej LD_LIBRARY_PATH jest: rozdzielonym dwukropkiem (:) zestawem katalogów, w których biblioteki są wyszukiwane jako pierwsze przed standardowym zestawem katalogów.
jest sprawdzana w czasie kompilacji (linkowania)
Sprawdzamy wartość:
echo $LD_LIBRARY_PATH
Zmieniamy wartosć czasowo:
na stałe ( w pliku ~/.bashrc)
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/absolute_path/' >> ~/.bashrc
PATH
edytujŚcieżka dostępu do plików wykonywalnych = PATH
Wyświetlamy wartość zmiennej PATH:
echo $PATH
Zmieniamy wartość zmiennej PATH:
PATH="$HOME/.cabal/bin:$PATH"
Zmiana działa:
- tylko w tym terminalu
- tylko na czas działania w tym terminalu
W celu stałej zmiany wartości zmiennej PATH dla danego użytkownika należy powyższą instrukcję dodać do swojego pliku
~/.profile
lub
~/.bash_profile
lub
~/.bash_login
Edycja pliku jest możliwa po otwarciu go w trybie administratora.
Klasa użytkowników | plik |
---|---|
aktualny | $HOME/.bash_profile |
wszyscy oprócz su | /etc/profile |
su (root) | /root/.bash_profile |
LD_LIBRARY_PATH
edytuj- Ścieżka dostępu do bibliotek skompilowanych [28]
- jest sprawdzana w czasie wykonywania programu.
- jest to lista katalogów rozdzielonych dwukropkiem (ang. colon) podobnie jak PATH
- katalogi zawierają prawidłowo skompilowane i zlinkowane biblioteki
złe ustawienie zmiennej powoduje błąd:[29]
error while loading shared libraries: lib***.so: cannot open shared object file: No such file or directory
Wyświetlamy
echo $LD_LIBRARY_PATH
Sprawdzamy lokalizację nieznalezionej biblioteki (jeśli jest zainstalowana):
sudo updatedb locate libgmp
zmieniamy czasowo:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
lub na stałe przez:
- wpis (jako root) w pliku /etc/ld.so.conf.d/*.conf
- ldconfig
- dodanie do ~/.bashrc
- /etc/environment w Ubuntu[30]
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/' >> ~/.bashrc
sudo ldconfig
Jeśli biblioteka nie jest zainstalowana to:
apt-cache search <libraryname>
Ręczna edycja
gedit ~/.bashrc
dodajemy wpis
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/
specjalne zmienne
edytujZmienne specjalne ( ang. Bash Special Variables)[31]
Sposoby pracy
edytuj- debugowanie skryptów [32]
Ręczne wpisywanie poleceń
edytujW konsoli wpisujemy:
which bash
otrzymujemy odpowiedź gdzie jest program obsługujący wiersz poleceń naszej powłoki:
/bin/bash
Skrypty
edytujPolecenia możemy
- zapisać do pliku tekstowego zwanego skryptem , np. g (uwaga: często skrypty powłoki mają rozszerzenie sh)
- plik powinien rozpoczynać się od magicznych znaków [33]):
#!/bin/bash
lub:
awk
- nadać mu atrybut wykonywalności (g oznacza tutaj przykładową nazwę pliku):
chmod +x g
- uruchomić plik znajdujący się w aktualnym katalogu:
./g
shebang
edytujShebang jest dwu bajtową magiczną liczbą (ang. magic number) oznaczającą typ pliku. Więcej o magicznej liczbie:
man magic
Po Shebangu następuje ścieżka do programu wykonującego polecenia skryptu.
Lokalizacja skryptu
edytujSkrypt może być:
- w dowolnym katalogu,
- uruchamiany z tego katalogu ./nazwa
- w katalogu ~/bin/ [34]
Sprawdzanie skryptu
edytujHeredoc
edytujOpis[37]:
- kilka poleceń zostanie wykonanych, a treść ich jest przekierowana na stdin programu [38]
Składnia: [39]
program <<LimitString command #1 command #2 ... LimitString
Przykłady: [40]
Zapisywanie kilku linii tekstu do pliku a.txt z użyciem cat: [41]
cat > a.txt << EOF
--------------------------
The quick brown fox
jumped over the lazy dog
--------------------------
EOF
Języki skryptowe
edytujjęzyk | nagłówek | przenośny nagłówek |
---|---|---|
bash | #!/bin/bash | #!/usr/bin/env bash |
php | #!/usr/bin/php | |
sed | ||
awk | ||
perl | #!/usr/bin/perl | #!/usr/bin/env perl |
python | #!/usr/bin/python | #! /usr/bin/env python |
Skróty klawiaturowe
edytujPolecenia BASH'a | Skrót klawiszowy | Opis polecenia |
---|---|---|
SIGTSTP | Ctrl-Z | zatrzymuje (kończy) proces |
SIGINT | Ctrl-C | zawiesza proces (pauza) |
Wejście i wyjście
edytujPrzykład:
./pseudo-de <mandel.kfb >pde.pgm
Pliki
edytujPrawa dostępu
edytujSprawdzanie praw dostępu
edytujsetfacl ls -l
zmienianaie praw dostępu
edytujgetfacl
Ile mamy plików na dysku ?
edytujfind / -type f | wc -l
Tworzenie animowanego gifa
edytujPrzykładowy skrypt uruchamiający polecenia z biblioteki ImageMagic tworzące z plików pgm animowany gif:
#!/bin/bash
# script file for BASH
# which bash
# save this file as g
# chmod +x g
# ./g
i=0
# for all pgm files in this directory
for file in *.pgm ; do
# b is name of file without extension
b=$(basename $file .pgm)
# change file name to integers and count files
((i= i+1))
# convert from pgm to gif and add text ( level ) using ImageMagic
convert $file -pointsize 50 -annotate +10+100 $b ${i}.gif
echo $file
done
echo convert all gif files to one animated gif_file
convert -delay 50 -loop 1 %d.gif[1-$i] aa${i}.gif
# convert -delay 50 -loop 0 %d.gif[1-$i] b${i}.mpg # it needs ffmpeg
# ffmpeg2theora %d.gif --framerate 12 --videoquality 9 -o output129.ogv
echo b${i} OK
# end
lub inna wersja z konwersją z svg:[42]
for i in ??.svg
do
rsvg $i ${i%svg}png
convert ${i%svg}png ${i%svg}gif
done
gifsicle --delay 4 --loop --optimize ??.gif > out.gif
nazwa pliku
edytujSkładniki nazwy pliku
- ścieżka ( ang. path )
- nazwa podstawowa ( ang. basename )
- kropka
- rozszerzenie ( ang. extension)
Polecenia
- basename
Zasady tworzenia prawidłwych nazw plików i katalogów:
- Filename w angielskiej wikipedii
- Linux / UNIX: Rules For Naming File And Directory Names Author: Vivek Gite Last updated: December 29, 2009
składniki nazwy
edytujJak podzielić nazwę na elementy? [43]
# https://www.cyberciti.biz/faq/bash-get-basename-of-filename-or-directory-name/
FILE="/home/vivek/lighttpd.tar.gz"
echo "${FILE#*.}" # print tar.gz
echo "${FILE##*.}" # print gz
ext="${FILE#*.}" # store output in a shell variable
echo "$FILE has $ext" # display it
rozszerzenie
edytujJak znaleźć pliki z określonym rozszerzeniem?[44] Tutaj dla przykładu "qph"
find . -type f -name '*.qph'
Nazwy plików z myślnikami na początku
edytujNazwy plików z myślnikami na początku mogą powodować wiele problemów[45]
- być błędnie interpretowane przez skrypt jako opcja
Zapobieganie
- wstawić -- między poleceniem (jak cp) a jego argumentami. Spowoduje to zatrzymanie skanowania w poszukiwaniu opcji
- upewnienie się, że nazwy plików zawsze zaczynają się od katalogu, używając względnych lub bezwzględnych nazw ścieżek.
Zmiana nazwy plików
edytujMożemy wykorzystać polecenia:
- move
- BASH/rename (wykorzystuje wyrażenia regularne Perla)
- cut
lub skrypt:
#!/bin/bash
# script file for BASH
# which bash
# save this file as r
# chmod +x r
# ./r
# for all pgm files in this directory
# for all pgm files in this directory
for file in *.pgm ; do
# remove first 3 chars from old file name
newfile=${file:3}
# change name of file
mv $file $newfile
echo $newfile
done
echo OK
# end
Kopiowanie plików
edytuj- tylko pliki z rozszerzeniem c
- z katalogu ~/c
- do katalogu ~/temp
- tak aby zachować podkatalogi
Możemy użyć:
find ~/c -maxdepth 7 -name "*.c" -exec cp {} -R ~/temp \;
ale w katalogu docelowym nie ma podkatalogów
Inna opcja:
cp -R ~/c ~/temp
Kopiuje z podkatalogami ale wszystkie pliki.
Działające polecenia:
- z użyciem find i tar
(cd ~/c ; find -maxdepth 7 -name "*.c" |tar -T - -c) |tar -C ~/temp -x
- z użyciem rsync:
rsync -a --include='*.c' --include='*/' --exclude='*' ~/c/ ~/temp/
Łaty i różnice
edytuj- porównywanie plików, różnice (ang. diff)
- łaty (ang. patch)
Łańcuchy,znaki i tekst
edytujDefinicje:
- łańcuch (ang. string) inaczej napis czyli ciąg znaków
- znak
nadawanie wartości
edytujSą trzy różne sposoby [48]
przetwarzanie tekstu
edytuj- Text interpretation in Bash : An overview of how Bash interprets text, both literally and symbolically. An overview of how Bash interprets text, both literally and symbolically. by Dan Nguyen
- Jak Bash może odróżnić polecenia, symbole i "tylko tekst" ?
- unicode
- unix.stackexchange question: in-bash-how-can-i-convert-a-unicode-codepoint-0-9a-f-into-a-printable-charact
- baeldung: find-non-ascii-chars: How to Find Non-ASCII Characters in Text Files in Linux ? by Robert Edward
- stackoverflow question: how-to-search-for-non-ascii-characters-with-bash-tools
Dzielenie słów
edytujDzielenie słów ( ang. Word Splitting[49] or Word expansion) jest to dzielenie łańcucha na słowa.
Następuje to w czasie [50]
- rozszerzenie parametrów ( ang. parameter expansion) [51]
- zamiana komend ( ang. command substitution)[52]
- rozwinięcie arytmetyczne ( ang. arithmetic expansion)
jeśli nie wystąpiło w podwójnych cudzysłowach
Powłoka traktuje każdy znak IFS jako ogranicznik ( ang. delimiter ) i dzieli wyniki innych interpretacji na słowa na tych znakach
Liczby
edytujCałkowite
edytujRozkład na liczby pierwsze: (zobacz man factor):
factor 27417 27417: 3 13 19 37
ale już:
time factor 237142198758023568227473377297792835283496928595231875152809132048206089502588927 factor: „237142198758023568227473377297792835283496928595231875152809132048206089502588927” jest za duża real 0m0.001s user 0m0.000s sys 0m0.000s
Sekwencje:
seq -w 0 11
wynik:
00 01 02 03 04 05 06 07 08 09 10 11
Zmiennoprzecinkowe
edytujBash nie wykonuje działań na liczbach zmiennoprzecinkowych. Korzystaj z :
Konwersja postaci naukowej do zmiennoprzecinkowej
edytujStandardowa odpowiedź nie może nie działać: [53]
printf '%.0f' 1.8200E+02 bash: printf: 1.8200E+02: nieprawidłowa liczba 0
Zmieniamy lokalnie ustawienia językowe (LC_NUMERIC):
LC_NUMERIC="en_US.UTF-8" printf "%f\n" 1.8200E+02 182.000000
i działa jak oczekujemy.
Jeśli chcemy zapisać rezultat konwersji do zmiennej to: [54]
radius="1.5e-1" radius=$(LC_NUMERIC="en_US.UTF-8" printf "%f\n" $radius)
bez znaku
edytujLiczba bez znaku [55]( absolutna wartość, moduł liczby)
${var#-}
System
edytujlsb_release -a
Informacje dostępne za pomocą cat: [56]
cat /proc/cpuinfo cat /proc/meminfo cat /proc/version cat /proc/scsi/scsi cat /proc/partitions
albo gcc
lub lista:
- cpu = lscpu
- sprzętu = lshw (list hardware):[57]
- pci = lspci
- scsi = lsscsi
- usb = lsusb
- urządzeń blokowych: lsblk
Przykłady:
sudo lshw -short lsblk -o KNAME,TYPE,SIZE,MODEL
Sprawdzanie kolejności bajtów (ang. endianess):
lscpu
przykładowy wynik:
Architecture: x86_64 Tryb(y) pracy CPU: 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Wątków na rdzeń: 2 Rdzeni na gniazdo: 4 Socket(s): 1 Węzłów NUMA: 1 ID producenta: GenuineIntel Rodzina CPU: 6 Model: 60 Model name: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz Wersja: 3 CPU MHz: 3401.195 CPU max MHz: 3900,0000 CPU min MHz: 800,0000 BogoMIPS: 6784.73 Wirtualizacja: VT-x Cache L1d: 32K Cache L1i: 32K Cache L2: 256K Cache L3: 8192K NUMA node0 CPU(s): 0-7 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm xsaveopt dtherm ida arat pln pts
Info o sprzęcie:
- hwinfo
- skrypt basha Inxi
- przestrzeń dysków
- wersja standardowa = df
- wersja w Pythonie = pydf
- zamontowane urządzenie = mount
- pamięć RAM = free
- urządzenia SATA = hdparm
Przykłady:[58]
inxi -Fx mount | column -t free -m sudo hdparm -i /dev/sda fdisk -l parted -l
płyta główn
edytujJak sprawdzić jaką mamy płytę główną ( ang. motherboard) ? [59]
cat /sys/devices/virtual/dmi/id/board_{vendor,name,version}
sudo dmidecode -t 2
GPU
edytujKarta graficzna
lspci | grep VGA
sterownik:
glxinfo | grep version
lub
ubuntu-drivers devices
cat /proc/driver/nvidia/version
Ustawienia:
nvidia-settings
Polecenia
edytujprefiks opcji poleceń:
- " -- ( ang. double dash) oznacza koniec opcji poleceń
ftp ftp://ftp.astro.caltech.edu/pub/pgplot/pgplot5.2.tar.gz
lista
edytuj- ack - "lepszy niż grep" napisany w Perlu
- ag - The Silver Searcher. Narzędzie do wyszukiwania kodu podobne do ack, z naciskiem na szybkość autorstwa Geoffa Greera i 204 współpracowników
- asciinema = Record and share your terminal sessions, the simple way.
- awk lub gawk (gnu awk)
- bc
- chcp = Change the active console Code Page[60]
- cjpeg : CLI program, który kompresuje nazwany plik obrazu lub standardowe wejście, i tworzy plik JPEG/JFIF na standardowym wyjściu. Obecnie obsługiwane formaty plików wejściowych to: PPM (format kolorów PBMPLUS), PGM (format skali szarości PBMPLUS), BMP, Targa i RLE (format Utah Raster Toolkit). (RLE jest obsługiwane tylko wtedy, gdy dostępna jest biblioteka URT).
- cut
- dc
- djpeg (decompress JPEG)
- du
- diff
- file
- find
- grep
- hash - zapamiętuje lokalizacje polecenia w tabeli skrótów (ang. hash table) lub podaje lokalizacje polecenia z tabeli skrótów, zamiast wyszukiwać polecenie w ścieżce określonej w zmiennej środowiskowej PATH.[61] Zobacz "help hash" lub "man bash" i wyszukaj tam hash w sekcji wbudowanych poleceń ( ang. builtin commands).
- hexdump
- jpegtran (transcode JPEG - lossless)
- ldconfig
- ldd
- less
- locate
- ls
- ltrace - a library call tracer
- man
- objdump
- od = octal dump
- patch
- printf
- ps
- readelf
- rm : rm -rf will ruin you : Remember When Pixar Accidentally DELETED Toy Story 2?
- sed
- ssh
- strings
- test
- time
- wc
- which
Lista wszystkich poleceń
edytujLiczba dostępnych poleceń zainstalowanych przez użytkownika:[62]
ls /usr/bin | wc -l
przykładowy wynik :
3239
inny katalog użytkownika:
ls /usr/local/bin | wc -l
przykładowy wynik :
7
Katalog poleceń systemowych :
ls /bin | wc -l
przykładowy wyni:
165
Szacuje się, że przecietny użytkownik pamieta około 30 poleceń [63]
Lista wszystkich poleceń:[64][65]
compgen -c # will list all the commands you could run.
Nie ma sposobu, aby wyświetlić listę funkcji lub wbudowanych funkcji, które działają we wszystkich powłokach. Możesz znaleźć listę wbudowanych w dokumentacji powłoki.
Możesz wyświetlić listę aliasów, uruchamiając wbudowany alias bez argumentu.
typy
edytuj"Powłoka zna cztery rodzaje poleceń.
- Aliasy( ang. Aliases): są to pseudonimy dla polecenia z pewnymi opcjami. Są one zdefiniowane w pliku inicjującym powłoki (~ / .bashrc dla bash).
- Funkcje: są fragmentami kodu powłoki o nazwie. Podobnie jak aliasy, są one zdefiniowane w pliku inicjalizacji powłoki.
- wewnętrzne czyli wbudowane ( ang. Builtins): powłoka zawiera niewielką liczbę wbudowanych poleceń. Większość wbudowanych manipuluje stanem powłoki (cd zmienia bieżący katalog, ustawia opcje zmian i parametry pozycyjne, eksport zmienia środowisko,…). Większość powłok oferuje w zasadzie te same wbudowane rozszerzenia, ale każda powłoka ma kilka rozszerzeń zestawu podstawowego.
- Polecenia zewnętrzne ( ang. External commands): są niezależne od powłoki. Podobnie jak inne programy, powłoka wykonuje programy zewnętrzne, wyszukując je w ścieżce wyszukiwania wykonywalnego. Zmienna środowiskowa PATH zawiera rozdzieloną dwukropkami listę katalogów do wyszukiwania programów.
W przypadku poleceń kilku typów o tej samej nazwie, wykonywane jest pierwsze dopasowanie w powyższej kolejności.
Możesz zobaczyć, jaki typ polecenia odpowiada nazwie, uruchamiając "[66]
type some_name
Przykład
type ld ld is hashed (/usr/bin/ld)
Informacja "ld is hashed" oznacza że lokalizacja polecenia ld jest w tablicy skrótów ( ang. hash table). Zamiast przeszukiwać całą ścieżkę dla pliku binarnego za każdym razem, gdy jest wywoływany, jest on umieszczany w tablicy skrótów w celu szybszego wyszukiwania. Tak więc każdy plik binarny, który jest już w tej tabeli skrótów, jest mieszany. Jeśli przeniesiesz pliki binarne, gdy są już zaszyfrowane, nadal będzie próbował wywołać je w ich starej lokalizacji. Jest to kwestia wydajności. [67] W nawiasie podana jest lokalizacja, czyli jest to zewnętrzne polecenie zapisane w tabeli skrótów (ang. hashed external command)
grupy
edytuj- GNU binutils jest zbiorem narzędzi binarnych.
binutils
edytujGNU binutils jest zbiorem narzędzi binarnych. Zawiera:[68]
- ld - GNU linker
- as - GNU assembler
- gold - nowy , szybszy linker tylko dla ELF
- addr2line - Konwertuje adresy na nazwy plików i numery linii
- ar - Narzędzie do tworzenia, modyfikowania i rozpakowywania archiwów
- c++filt - Filtruj, aby uporządkować symbole zakodowane w C++.
- dlltool - Tworzy pliki do budowania i używania bibliotek DLL
- elfedit - Umożliwia zmianę plików w formacie ELF
- gprof - Wyświetla informacje o profilowaniu
- gprofng - Zbiera i wyświetla dane dotyczące wydajności aplikacji
- nlmconv - Konwertuje kod obiektowy na NLM.
- nm - Wyświetla listę symboli z plików obiektowych
- objcopy - Kopiuje i tłumaczy pliki obiektowe
- objdump - Wyświetla informacje z plików obiektowych
- ranlib - Generuje indeks do zawartości archiwum
- readelf - Wyświetla informacje z dowolnego pliku obiektowego formatu ELF
- size - Wyświetla rozmiary sekcji obiektu lub pliku archiwum
- strings - Wyświetla możliwe do wydrukowania ciągi znaków z plików
- strip - Odrzuca symbole
- windmc - Kompilator komunikatów zgodny z systemem Windows
- windres - Kompilator plików zasobów systemu Windows
wersja
edytujWersja binutils:[69]
ld -v GNU ld (GNU Binutils for Ubuntu) 2.38
lub
ld --version
dpkg -l | grep binutils
Przykładowy wynik:
ii binutils 2.38-4ubuntu2.1 amd64 GNU assembler, linker and binary utilities ii binutils-common:amd64 2.38-4ubuntu2.1 amd64 Common files for the GNU assembler, linker and binary utilities ii binutils-x86-64-linux-gnu 2.38-4ubuntu2.1 amd64 GNU binary utilities, for x86-64-linux-gnu target ii libbinutils:amd64 2.38-4ubuntu2.1 amd64 GNU binary utilities (private shared library)
Polecenie:
apt-cache policy binutils
Przykładowy wynik:
binutils: Installed: 2.38-4ubuntu2.1 Candidate: 2.38-4ubuntu2.1 Version table: *** 2.38-4ubuntu2.1 500 500 http://pl.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages 500 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages 100 /var/lib/dpkg/status 2.38-3ubuntu1 500 500 http://pl.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
Polecenie:
apt-cache show binutil
historia
edytujSprawdzamy 10 najczęściej używanych poleceń konsoli:[70]
history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10
przykładowy wynik :
1 239 23.9% git
2 231 23.1% gcc
3 49 4.9% sudo
4 43 4.3% time
5 31 3.1% convert
6 26 2.6% make
7 22 2.2% locate
8 22 2.2% cd
9 15 1.5% ls
10 12 1.2% python
Bezpieczeństwo
edytujJak mogę bezpiecznie uruchomić niezaufany plik wykonywalny w systemie Linux?[71]
- Virtualization
- virtual machine
- conatainer ( OS or application)
- Firejail
- systemd-nspawn
- chroot
Problemy
edytujzły interpreter
edytujbash: ./g.sh: /bin/bash^M: zły interpreter: Nie ma takiego pliku ani katalogu
lub w wersji angielskiej:[72]
bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory
Błąd jest spowodowany złym znakiem końca linii[73]
Żródła
edytujZobacz również
edytuj- Programowanie w systemie UNIX
- commandlinefu - przkłady gotowych rozwiązań za pomocą poleceń konsolowych
- code Obrazy i kod BASH użyty do ich tworzenia
- how to geek : 15-special-characters-you-need-to-know-for-bash
- #!/bin/bash - programowanie w powłoce , kurs autorstwa Tomasza Gawędy
- Math Commands from Advanced Bash-Scripting Guide by Mendel Cooper - bc, dc i awk
- bash-hackers.org
- Dokumentacja Gentoo - bash
- Advanced Bash-Scripting Guide. An in-depth exploration of the art of shell scripting by Mendel Cooper
- explain shell
- shell check
- jokes: unix errors
- Bash scripting cheatsheet by Rico Sta. Cruz
- Data Science at the Command Line by Obtain, Scrub, Explore, and Model Data with Unix Power Tools Welcome to the website of the second edition of Data Science at the Command Line by Jeroen Janssens, published by O’Reilly Media in October 2021.
- Bash FAQ by GrayCat
- Bash Pitfalls by GrayCat
Przypisy
edytuj- ↑ unix.stackexchange question: what-is-the-difference-between-the-bash-operators-vs-vs-vs
- ↑ man - polecenie systemu Unix uruchomiane z wiersza poleceń powłoki systemowej
- ↑ | explainshell
- ↑ w3cub bash docs
- ↑ unix.stackexchange question: what-is-the-difference-between-the-bash-operators-vs-vs-vs
- ↑ Powłoka systemu UNIX- dr inż. Edward Śliwa
- ↑ howtogeek : 15-special-characters-you-need-to-know-for-bash
- ↑ shell metachar by Tim Bowe
- ↑ bash-scripts-regular-expressions by Mikhail Raevskiy Sep 20, 2020
- ↑ What is the CVE-2014-6271 bash vulnerability, and how do I fix it?
- ↑ superuser question: can-i-use-pipe-output-as-a-shell-script-argument
- ↑ Bash options
- ↑ unix.stackexchange question: how-can-i-list-bashes-options-for-the-current-shell
- ↑ Zmienna środowiskowa w wikipedii
- ↑ Environment Variables
- ↑ env
- ↑ [1]
- ↑ tldp : internal variables
- ↑ theunixschool : linux-shell-what-is-ifs ?
- ↑ is in a number of the /etc/init.d/* scripts. What does LANG=C do and why do you need to set LANG=C.
- ↑ to change the bash shell language ?
- ↑ Locale w wikipedii
- ↑ doc 8.3. The locale
- ↑ - Linux man page
- ↑ [http://stackoverflow.com/questions/12845997/unexplicable-error-in-bash-printf-command-inside-a-script-returns-invalid-numb STackoverflow: Unexplicable error in bash: printf command inside a script returns “invalid number” ]
- ↑ Linux - Library Path (LD_LIBRARY_PATH, LIBPATH, SHLIB_PATH) by DataCademis
- ↑ [Troubleshooters.Com and T.C Linux Library Present: Adding a Directory to the Path by Steve Litt]
- ↑ ubuntu environment Variables
- ↑ stackoverflow question: linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s
- ↑ stackoverflow question: how-to-set-the-environmental-variable-ld-library-path-in-linux
- ↑ tldp refcard
- ↑ linuxconfig.org: how-to-debug-bash-scripts
- ↑ Shebang w wikipedii
- ↑ The Beginner’s Guide to Shell Scripting: The Basics
- ↑ | spellcheck
- ↑ tldp - something goes wrong (debugging)
- ↑ Here document in english wikipedia
- ↑ Kurs pracy w systemie Linux (pracownia Michalisa
- ↑ Chapter 19. Here Documents
- ↑ stackoverflow: How can I write a here doc to a file in Bash script?
- ↑ Here Documents from ss64
- ↑ ReCode Project - Topographic Form animated by ClaudiusMaximus
- ↑ cyberciti : bash-get-basename-of-filename-or-directory-name by Vivek Gite Last updated: September 19, 2018
- ↑ stackoverflow question: recursively-look-for-files-with-a-specific-extension
- ↑ Filenames with leading dashes by GrayCat
- ↑ Archiwum grupy pl.comp.os.linux.programowanie: Bash: kopiowanie wybranych plików z podkatalogami
- ↑ [http://ubuntu.pl/forum/viewtopic.php?f=170&t=160739%7Cpoprawne wywołanie rsync w bash w forum ubuntu.pl
- ↑ Bash String Examples from HackTux
- ↑ gnu bash manual: Word-Splitting
- ↑ datacadamia : bash word splitting
- ↑ gnu bash manual : Shell-Parameter-Expansion
- ↑ gnu bash manua: Command-Substitution
- ↑ [http://stackoverflow.com/questions/9506584/convert-scientific-notation-bash-script Stackoverflow: convert scientific notation bash script ]
- ↑ [http://www.cyberciti.biz/faq/ksh-csh-shell-assign-store-printf-result-variable/ Linux / Unix: Bash Shell Assign Printf Result To Variable by NIXCRAFT ]
- ↑ stackoverflow question : absolute-value-of-a-number
- ↑ 16 commands to check hardware information on Linux By Silver Moon On Apr 8, 2014
- ↑ Hardware Lister (lshw) - home page
- ↑ unix.stackexchange question: how-to-list-disk-in-linux
- ↑ askubuntu question: how-do-i-find-out-my-motherboard-model
- ↑ chcp Copyright © 1999-2023 SS64.com
- ↑ opengroup online pubs: hash
- ↑ linuxconfig.org: linux-commands
- ↑ quora : Do-experienced-Linux-users-remember-all-the-commands
- ↑ unix.stackexchange question: list-all-commands-that-a-shell-knows
- ↑ stackoverflow question: linux-command-to-list-all-available-commands-and-aliases
- ↑ unix.stackexchange question: list-all-commands-that-a-shell-knows, odpowiedź Gilles 'SO- stop being evil', tłumaczenie nieautoryzowane , ( google translate)
- ↑ unix.stackexchange question : what-does-rm-is-hashed-mean
- ↑ sourceware : binutils
- ↑ stackoverflow question : how-to-see-what-version-of-binutils-is-on-ubuntu ?
- ↑ Free softwares I use by YouJun Hu
- ↑ superuser question: how-can-i-run-an-untrusted-executable-on-linux-safely ?
- ↑ stackoverflow question : configure-bin-shm-bad-interpreter
- ↑ webhostingtalk : skrypt-sh-problem/