Først hvad er Bash?

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.

Author:

Jeg er en professionel system administrator og grundlægger af linuxboxen.dk Jeg er en ivrig Linux-elsker og open source-entusiast. Jeg bruger Ubuntu og tror på at dele viden. Bortset fra Linux, elsker musik og dyr. Jeg er en stor fan af Dire straits.

Skriv et svar