Wstęp

edytuj
  • powłoka ( ang. shell)


odmiany

edytuj
  • POSIX shell (sh)
  • Bourne shell (sh)
  • Korn shell (ksh)
  • Bourne Again shell (bash)
  • Z shell (zsh)
  • Debian Almquist shell (dash)

Dokumentacja

edytuj

Pomoc:

  • 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:

  • [ = brackets[5]
  • double brackets = [[
  • ( = parenthesis
  • (( = double parenthesis

Metaznaki

edytuj

Metaznaki basha: [6][7]

  • ;
  • &
  • (
  • )
  • |
  • <
  • >
  • nl (nowa linia)
  • spacja (odstęp)
  • TAB
  • \ ( backslash)

Backslash

edytuj

Ma 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

edytuj

wyraż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

edytuj

Sprawdzamy 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

edytuj

Sprawdzamy 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

Opcje Basha [12].

Dodanie flagi "-x" pozwala zobaczyć co dokładnie skrypt robi:

   #!/bin/bash -x

Polecenie shopt drukuje ustawienia[13]

 shopt -o

zmienne

edytuj

Wymień 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

edytuj

Opis [14][15]

Wyś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

edytuj

Nie 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ę ...

Zmienna 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.

Wartość 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

edytuj

Sprawdzamy wartość:

locale | grep NUM
LC_NUMERIC="pl_PL.UTF-8"


wpływa na dziłanie printf[25]

LIBRARY_PATH

edytuj

LD_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

Ś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.



Położenie pliku w zależności od klasy użytkowników [27]
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

edytuj

Zmienne specjalne ( ang. Bash Special Variables)[31]

Sposoby pracy

edytuj
  • debugowanie skryptów [32]

Ręczne wpisywanie poleceń

edytuj

W konsoli wpisujemy:

which bash

otrzymujemy odpowiedź gdzie jest program obsługujący wiersz poleceń naszej powłoki:

/bin/bash

Skrypty

edytuj

Polecenia 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

edytuj

Shebang 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

edytuj

Skrypt może być:

  • w dowolnym katalogu,
    • uruchamiany z tego katalogu ./nazwa
  • w katalogu ~/bin/ [34]

Sprawdzanie skryptu

edytuj
  • online [35]
  • debugowanie [36]: #!/bin/bash -x
  • sprawdzanie wyjścia skryptu: echo $?

Heredoc

edytuj

Opis[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

edytuj
ję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

edytuj
Polecenia 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

edytuj

Potok

Przykład:

 ./pseudo-de <mandel.kfb >pde.pgm


Prawa dostępu

edytuj

Sprawdzanie praw dostępu

edytuj
setfacl
ls -l


zmienianaie praw dostępu

edytuj
getfacl

Ile mamy plików na dysku ?

edytuj
find / -type f | wc -l


Tworzenie animowanego gifa

edytuj

Przykł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

edytuj

Skł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:

składniki nazwy

edytuj

Jak 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

edytuj

Jak 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

edytuj

Nazwy 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

edytuj

Możemy wykorzystać polecenia:

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

Chcemy skopiować: [46][47]

  • 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

Łańcuchy,znaki i tekst

edytuj

Definicje:

  • łańcuch (ang. string) inaczej napis czyli ciąg znaków
  • znak



nadawanie wartości

edytuj

Są trzy różne sposoby [48]

przetwarzanie tekstu

edytuj


Dzielenie słów

edytuj

Dzielenie 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

edytuj

Całkowite

edytuj

Rozkł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

edytuj

Bash nie wykonuje działań na liczbach zmiennoprzecinkowych. Korzystaj z :


Konwersja postaci naukowej do zmiennoprzecinkowej

edytuj

Standardowa 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

edytuj

Liczba bez znaku [55]( absolutna wartość, moduł liczby)

${var#-}

System

edytuj
lsb_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

edytuj

Jak sprawdzić jaką mamy płytę główną ( ang. motherboard) ? [59]

cat /sys/devices/virtual/dmi/id/board_{vendor,name,version}


sudo dmidecode -t 2

Karta graficzna

lspci | grep VGA



sterownik:

glxinfo | grep version

lub

ubuntu-drivers devices


cat /proc/driver/nvidia/version 


Ustawienia:

nvidia-settings

Polecenia

edytuj

prefiks opcji poleceń:

  • " -- ( ang. double dash) oznacza koniec opcji poleceń


ftp ftp://ftp.astro.caltech.edu/pub/pgplot/pgplot5.2.tar.gz

  • 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ń

edytuj

Liczba 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.

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


  • GNU binutils jest zbiorem narzędzi binarnych.

binutils

edytuj

GNU 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

edytuj

Wersja 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

edytuj

Sprawdzamy 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

edytuj

Jak mogę bezpiecznie uruchomić niezaufany plik wykonywalny w systemie Linux?[71]

  • Virtualization
    • virtual machine
    • conatainer ( OS or application)
  • Firejail
  • systemd-nspawn
  • chroot

Problemy

edytuj

zły interpreter

edytuj
 bash: ./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

edytuj

Zobacz również

edytuj

Przypisy

edytuj
  1. unix.stackexchange question: what-is-the-difference-between-the-bash-operators-vs-vs-vs
  2. man - polecenie systemu Unix uruchomiane z wiersza poleceń powłoki systemowej
  3. | explainshell
  4. w3cub bash docs
  5. unix.stackexchange question: what-is-the-difference-between-the-bash-operators-vs-vs-vs
  6. Powłoka systemu UNIX- dr inż. Edward Śliwa
  7. howtogeek : 15-special-characters-you-need-to-know-for-bash
  8. shell metachar by Tim Bowe
  9. bash-scripts-regular-expressions by Mikhail Raevskiy Sep 20, 2020
  10. What is the CVE-2014-6271 bash vulnerability, and how do I fix it?
  11. superuser question: can-i-use-pipe-output-as-a-shell-script-argument
  12. Bash options
  13. unix.stackexchange question: how-can-i-list-bashes-options-for-the-current-shell
  14. Zmienna środowiskowa w wikipedii
  15. Environment Variables
  16. env
  17. [1]
  18. tldp : internal variables
  19. theunixschool : linux-shell-what-is-ifs ?
  20. is in a number of the /etc/init.d/* scripts. What does LANG=C do and why do you need to set LANG=C.
  21. to change the bash shell language ?
  22. Locale w wikipedii
  23. doc 8.3. The locale
  24. - Linux man page
  25. [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” ]
  26. Linux - Library Path (LD_LIBRARY_PATH, LIBPATH, SHLIB_PATH) by DataCademis
  27. [Troubleshooters.Com and T.C Linux Library Present: Adding a Directory to the Path by Steve Litt]
  28. ubuntu environment Variables
  29. stackoverflow question: linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s
  30. stackoverflow question: how-to-set-the-environmental-variable-ld-library-path-in-linux
  31. tldp refcard
  32. linuxconfig.org: how-to-debug-bash-scripts
  33. Shebang w wikipedii
  34. The Beginner’s Guide to Shell Scripting: The Basics
  35. | spellcheck
  36. tldp - something goes wrong (debugging)
  37. Here document in english wikipedia
  38. Kurs pracy w systemie Linux (pracownia Michalisa
  39. Chapter 19. Here Documents
  40. stackoverflow: How can I write a here doc to a file in Bash script?
  41. Here Documents from ss64
  42. ReCode Project - Topographic Form animated by ClaudiusMaximus
  43. cyberciti : bash-get-basename-of-filename-or-directory-name by Vivek Gite Last updated: September 19, 2018
  44. stackoverflow question: recursively-look-for-files-with-a-specific-extension
  45. Filenames with leading dashes by GrayCat
  46. Archiwum grupy pl.comp.os.linux.programowanie: Bash: kopiowanie wybranych plików z podkatalogami
  47. [http://ubuntu.pl/forum/viewtopic.php?f=170&t=160739%7Cpoprawne wywołanie rsync w bash w forum ubuntu.pl
  48. Bash String Examples from HackTux
  49. gnu bash manual: Word-Splitting
  50. datacadamia : bash word splitting
  51. gnu bash manual : Shell-Parameter-Expansion
  52. gnu bash manua: Command-Substitution
  53. [http://stackoverflow.com/questions/9506584/convert-scientific-notation-bash-script Stackoverflow: convert scientific notation bash script ]
  54. [http://www.cyberciti.biz/faq/ksh-csh-shell-assign-store-printf-result-variable/ Linux / Unix: Bash Shell Assign Printf Result To Variable by NIXCRAFT ]
  55. stackoverflow question : absolute-value-of-a-number
  56. 16 commands to check hardware information on Linux By Silver Moon On Apr 8, 2014
  57. Hardware Lister (lshw) - home page
  58. unix.stackexchange question: how-to-list-disk-in-linux
  59. askubuntu question: how-do-i-find-out-my-motherboard-model
  60. chcp Copyright © 1999-2023 SS64.com
  61. opengroup online pubs: hash
  62. linuxconfig.org: linux-commands
  63. quora : Do-experienced-Linux-users-remember-all-the-commands
  64. unix.stackexchange question: list-all-commands-that-a-shell-knows
  65. stackoverflow question: linux-command-to-list-all-available-commands-and-aliases
  66. unix.stackexchange question: list-all-commands-that-a-shell-knows, odpowiedź Gilles 'SO- stop being evil', tłumaczenie nieautoryzowane , ( google translate)
  67. unix.stackexchange question : what-does-rm-is-hashed-mean
  68. sourceware : binutils
  69. stackoverflow question : how-to-see-what-version-of-binutils-is-on-ubuntu ?
  70. Free softwares I use by YouJun Hu
  71. superuser question: how-can-i-run-an-untrusted-executable-on-linux-safely ?
  72. stackoverflow question : configure-bin-shm-bad-interpreter
  73. webhostingtalk : skrypt-sh-problem/