Først hvad er Bash? Bash er en kommandofortolker, som både brugere og applikationer kan benytte til at køre programmer og ændre konfigurationen af et Unix-lignende system. Bash blev lanceret i 1989 som en videreudvikling af flere andre kommandofortolkere, bl.a. Bourne shell (sh). Bash er open source og er derfor blevet brugt i mange open source-styresystemer. Bash har en masse indbyggede kommandoer, og nogle af dem er en skrabet version af deres eksterne GNU coreutils fætre. Så hvorfor bruge dem? Du har sikkert allerede brugt dem uden du tænker over det. På grund af rækkefølgen af hvordan kommandoer i Bash bliver udført: Som er denne. Bash aliaser Bash søgeord Bash funktioner Bash builtins Scripts og eksekverbare programmer, der er i din PATH Så når du kører echo, kill, printf, PWD, eller test så er det sandsynligvis du bruger bash builtins snarere end GNU coreutils kommandoer. Hvordan kan du vide hvilken type som bruges ?. Ved hjælp af en Bash builtins som fortæller dig, hvilken kommando der bruges.
$ command -V echo echo is a shell builtin $ command -V ping ping is /bin/ping
Bash har ikke man-sider, men den har en hjælpe kommando indbygget, der viser syntaks og muligheder:
$ help echo echo: echo [-neE] [arg ...] Write arguments to the standard output. Display the ARGs on the standard output followed by a newline. Options: -n do not append a newline -e enable interpretation of the following backslash escapes [...]
I normale linux komandoer er syntaks for hjælpe info –help hvor hjælp er en kommando parametere i stedet for en kommando. Kommandoen typen ser meget gerne kommandoen indbyggede, men det gør mere:
$ type -a cat cat is /bin/cat $ type -t cat file $ type ll ll is aliased to `ls -alF' $ type -a echo echo is a shell builtin echo is /bin/echo $ type -t grep alias
type kommandoen viser hvilken indbygget kommandoer, funktioner, aliaser, nøgleord (også kaldet reserverede ord), og binære eksekverbare filer og scripts, som den kalder fil. På dette punkt, hvis du er ligesom mig, siger du du brummende “Hvad med at vise mig en liste over de egenskaber.” Du kan finde disse ting i. The GNU Bash reference Manuelle indekser. Pointen med denne lille øvelse er, så du ved, hvad du virkelig bruger, når du skriver en kommando i Bash shell, og så du ved, hvordan det ser ud til Bash. Der er endnu en overlappende Bash indbyggede, og det er tid nøgleordet:
$ type -t time keyword
Så hvorfor vil du bruge bash indbyget komandoer is steder for GNU komandoerne. Indbygget komandoer bliver sikkert udført hurtigere en extern komando. Fordi en externe komando skal startes af bash. Det betyder sikkert ikke så meget mere som i gamle dage hvor der ikke var så meget power som idag. Men husk at bruge hele stien eks. /bin/echo i stedet for bare echo, i dine skripts. For at finde den sti du skal bruge kan du bruge den gode gammle which komando. Som vist her.
$ which echo /bin/echo $ which which /usr/bin/which
Bash indbygget funktioner. Med komandoen declare kan du få informater om bash indbygget funktioner og oprette dem selv. Kør declare -F for at se en liste over de indbygget funktioner. declare -f lister alle funktioner. declare -f funktion viser den funktion.
$ declare -F declare -f __all_modules declare -f __cards declare -f __expand_tilde_by_ref declare -f __get_cword_at_cursor_by_ref declare -f __git_eread declare -f __git_ps1 declare -f __git_ps1_colorize_gitstring declare -f __git_ps1_show_upstream declare -f __grub_dir declare -f __grub_get_last_option declare -f __grub_get_options_from_help declare -f __grub_get_options_from_usage declare -f __grub_list_menuentries declare -f __grub_list_modules declare -f __grubcomp declare -f __loaded_modules declare -f __ltrim_colon_completions declare -f __parse_options declare -f __ports declare -f __profiles declare -f __reassemble_comp_words_by_ref declare -f __resample_methods declare -f __sink_inputs declare -f __sinks declare -f __sinks_idx declare -f __source_outputs declare -f __sources declare -f __zfs_argument_chosen declare -f __zfs_complete declare -f __zfs_complete_multiple_options declare -f __zfs_complete_ordered_arguments declare -f __zfs_complete_switch declare -f __zfs_get_commands declare -f __zfs_get_editable_properties declare -f __zfs_get_inheritable_properties declare -f __zfs_get_properties declare -f __zfs_list_datasets declare -f __zfs_list_filesystems declare -f __zfs_list_volumes declare -f __zfs_match_explicit_snapshot declare -f __zfs_match_multiple_snapshots declare -f __zfs_match_snapshot declare -f __zpool_complete declare -f __zpool_get_commands declare -f __zpool_get_editable_properties declare -f __zpool_get_properties declare -f __zpool_list_pools declare -f _a2disconf declare -f _a2dismod declare -f _a2dissite declare -f _a2enconf declare -f _a2enmod declare -f _a2ensite declare -f _allowed_groups declare -f _allowed_users declare -f _apache2_allcomp declare -f _apache2_conf declare -f _apache2_mods declare -f _apache2_sites declare -f _apport-bug declare -f _apport-cli declare -f _apport-collect declare -f _apport-unpack declare -f _apport_parameterless declare -f _apport_symptoms declare -f _available_interfaces declare -f _axi_cache declare -f _cd declare -f _cd_devices declare -f _command declare -f _command_offset declare -f _complete_as_root declare -f _completion_loader declare -f _configured_interfaces declare -f _count_args declare -f _cryptdisks declare -f _debconf_show declare -f _desktop_file_validate declare -f _dkms declare -f _dvd_devices declare -f _expand declare -f _filedir declare -f _filedir_xspec declare -f _filename_parts declare -f _fstypes declare -f _get_comp_words_by_refhttp://www.linuxboxen.dk/?q=show-command/141 declare -f _get_cword declare -f _get_first_arg declare -f _get_pword declare -f _gids declare -f _grub_editenv declare -f _grub_install declare -f _grub_mkconfig declare -f _grub_mkfont declare -f _grub_mkimage declare -f _grub_mkpasswd_pbkdf2 declare -f _grub_mkrescue declare -f _grub_probe declare -f _grub_script_check declare -f _grub_set_entry declare -f _grub_setup declare -f _have declare -f _init_completion declare -f _inkscape declare -f _installed_modules declare -f _ip_addresses declare -f _kernel_versions declare -f _kernels declare -f _known_hosts declare -f _known_hosts_real declare -f _loexp_ declare -f _longopt declare -f _mac_addresses declare -f _minimal declare -f _modules declare -f _ncpus declare -f _ocamlfind declare -f _ocamlfind_add declare -f _ocamlfind_flags declare -f _ocamlfind_packages declare -f _openvpn declare -f _pacat declare -f _pacat_file_formats declare -f _pacmd declare -f _pactl declare -f _padsp declare -f _parse_help declare -f _parse_usage declare -f _pasuspender declare -f _pci_ids declare -f _pgids declare -f _pids declare -f _pnames declare -f _poff declare -f _pon declare -f _pulseaudio declare -f _quote_readline_by_ref declare -f _realcommand declare -f _rl_enabled declare -f _root_command declare -f _service declare -f _services declare -f _shells declare -f _signals declare -f _split_longopt declare -f _subdirectories declare -f _svn declare -f _svn_grcut declare -f _svn_info declare -f _svn_lls declare -f _svn_read_hashfile declare -f _svnadmin declare -f _svndumpfilter declare -f _svnlook declare -f _svnsync declare -f _svnversion declare -f _sysvdirs declare -f _terms declare -f _tilde declare -f _ufw declare -f _ufw_app_commands declare -f _ufw_commands declare -f _ufw_default_commands declare -f _ufw_logging_commands declare -f _ufw_rule_commands declare -f _ufw_show_commands declare -f _ufw_status_commands declare -f _uids declare -f _update_initramfs declare -f _upstart_events declare -f _upstart_initctl declare -f _upstart_jobs declare -f _upstart_reload declare -f _upstart_restart declare -f _upstart_start declare -f _upstart_startable_jobs declare -f _upstart_status declare -f _upstart_stop declare -f _upstart_stoppable_jobs declare -f _upvar declare -f _upvars declare -f _usb_ids declare -f _user_at_host declare -f _usergroup declare -f _userland declare -f _valgrind declare -f _variables declare -f _xfunc declare -f _xinetd_services declare -f command_not_found_handle declare -f dequote declare -f in_array declare -f quote declare -f quote_readline
$ type quote quote is a function quote () { echo \'${1//\'/\'\\\'\'}\' }
Dette virker også på funktioner som du selv opetter. Lige som dette eksemple testfunc som skifter dir til /etc
$ function testfunc > { > cd /etc > }
Bash store styrker. En ting som er meget vigtigt at vide er hvordan linux styre processer som køre på systemet. De kan være svære at stoppe, så hvordan man styre processer der er gået i hegnet eller bruger alt cpu. Jeg har haft lidt problemer med kmail i den nyeste version som ikke rigtigt lukke ned. Den starter en enkel process som vist her med ps komandoen.
$ ps axf|grep kmail 2489 ? Sl 1:44 /usr/bin/kmail -caption KMail
Jeg prøvede med en normal kill
$ kill 2489
Dette eksemple sender vi default signalet til (terminate) signal det svare til CTRL+c. Venter ………. hmmm Men hvad hvis det ikke virker ?. Så er det godt der er en dark vader metode SIGKILL. Som vist her.
$ kill -9 2489
Dette er nuke versionen af kill. Og den virker altid. som GNU man sider siger. “The SIGKILL signal is used to cause immediate program termination. It cannot be handled or ignored, and is therefore always fatal. It is also not possible to block this signal.”
Oversat : SIGKILL signalet er udviklet til straks at stoppe den process. Det kan ikke ændre og blive ignoret af processen, og derfor vil det altid blive fatal for processen og det kan ikke blokeres/ignores. Så hvad er forskellen på bash kill og GNU kill. Det kan du se med hjælpe teksten i bash.
$ help kill kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] Send a signal to a job. Send the processes identified by PID or JOBSPEC the signal named by SIGSPEC or SIGNUM. If neither SIGSPEC nor SIGNUM is present, then SIGTERM is assumed. Options: -s sig SIG is a signal name -n sig SIG is a signal number -l list the signal names; if arguments follow `-l' they are assumed to be signal numbers for which names should be listed Kill is a shell builtin for two reasons: it allows job IDs to be used instead of process IDs, and allows processes to be killed if the limit on processes that you can create is reached. Exit Status: Returns success unless an invalid option is given or an error occurs.
En anden fordel er, den kan bruge job kontrolnumre udover PID. I denne moderne æra af tabbed terminalemulatorer job kontrol er ikke big deal, men muligheden er der, hvis du ønsker det. Den største fordel er, at du kan dræbe processer, selv om de har gået amok og maxed ud systemets proces grænseværdi, som forhindrer dig i at starte /bin/kill. Ja, der er en grænse, og du kan se, hvad det er ved at forespørge /proc:
$ cat /proc/sys/kernel/threads-max 125785
Med bash kill er der flere metoder til at sende et signal. I dette eksempel er alle det samme som sker.
$ kill 2489 $ kill -s TERM 2489 $ kill -s SIGTERM 2489 $ kill -n 15 2489
kill -l viser alle typer af signaler som du kan sende. Du kan se at -n 15 er SIGTERM
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
Hvis du bruger lidt tid på bash og GNU bøger vil du finde mange ting som bash kan gøre for dig.