본문 바로가기

CentOS/Study

[Study33]Linux Bash 셸 기술로 생산성 향상 - 배쉬쉘 기능(Bash Shell Funtion)

반응형

배쉬쉘의 기능(bash Shell Function)

배쉬쉘은 리눅스와 유닉스 운영체제에서 가장 많이 사용되는 쉘입니다. 배쉬쉘은 다양한 기능을 제공하며, 이 중 함수(function)라는 기능은 특히 유용합니다.

함수는 일련의 명령어를 하나의 명령어로 만들어 사용할 수 있게 해줍니다. 이는 코드의 중복을 방지하고, 작성한 코드를 재활용할 수 있게 해줍니다. 또한, 함수 내에서 변수를 사용할 수 있으며, 이를 통해 함수의 재사용성을 높일 수 있습니다.

함수를 사용하려면, 우선 함수를 정의해야 합니다. 함수를 정의할 때는 함수의 이름과 실행할 코드를 정의해야 합니다. 이후, 함수를 호출하면 정의한 코드를 실행합니다.

# set -o/* 쉘 자체의 기능 전체 목록 확인 */
# set -o vi /* 쉘 자체의 기능 중 vi 기능을 켭니다 */
# set +o vi /* 쉘 자체의 기능 중 vi 기능을 끕니다 */
  • 셸 기능 전체 목록 확인: set -o 명령어를 사용하여 사용 가능한 셸 기능의 전체 목록을 확인할 수 있습니다.
  • vi 기능 켜기: set -o vi 명령어를 사용하여 vi 기능을 켤 수 있습니다.
  • vi 기능 끄기: vi 기능을 끄려면 set +o vi 명령어를 사용합니다.

기본적으로 대부분의 유닉스 셸은 emacs 스타일의 라인 편집을 사용합니다. 그러나 일부 사용자는 vi 스타일의 라인 편집을 선호하기도 합니다. 따라서 set -o vi 명령어를 사용하여 vi 스타일의 라인 편집을 활성화할 수 있으며, set +o vi 명령어를 사용하여 이를 비활성화할 수 있습니다. 이러한 명령어와 기능을 알면 셸 세션을 사용자의 필요에 맞게 더욱 효율적으로 사용할 수 있습니다.

set -o ignoreeof 명령어를 사용하면 Ctrl + D 키 조합을 사용하여 실수로 로그아웃하는 것을 방지할 수 있습니다. 또한 set -o noclobber 명령어를 사용하면 > 리디렉션 연산자를 사용할 때 중요한 파일을 실수로 덮어쓰지 않도록 방지할 수 있습니다.

또한 디렉토리를 탐색하거나 긴 파일 이름을 입력할 때 시간과 노력을 절약할 수 있는 파일 이름 자동 완성을 위해 Tab 키를 사용할 수 있습니다. set -o vi 명령어를 사용하여 vi 스타일 편집을 사용하기도 합니다. 이는 기본적으로 emacs 스타일 편집을 사용하는 사용자에게는 도움이 되지 않을 수도 있습니다.

이러한 기능들을 사용하여 셸 세션을 보다 효율적으로 사용할 수 있습니다.

 

bash 쉘의 기능

allexport            off
braceexpand          on
emacs                on/* 기본적인 편집기 선언 */
errexit              off
errtrace             off
functrace            off
hashall              on
histexpand           on
history              on
ignoreeof            off/* 로그아웃 방지 기능 선언 */
interactive-comments on
keyword              off
monitor              on
noclobber            off/* 덮어쓰기 방지 기능 선언 */
noexec               off
noglob               off
nolog                off
notify               off
nounset              off
onecmd               off
physical             off
pipefail             off
posix                off
privileged           off
verbose              off
vi                   off/* 기본적인 편집기 선언 */
xtrace               off

위 코드는 bash 쉘에서 사용할 수 있는 다양한 옵션들을 나열한 것입니다. 이 옵션들 중 일부는 명령어를 실행할 때 발생하는 문제를 해결하거나, 쉘 세션을 보다 효율적으로 사용하기 위한 목적으로 사용됩니다. 이러한 옵션들은 각각의 기능에 따라 on 또는 off로 설정되어 있습니다. 이러한 옵션들을 사용하여 쉘 세션을 보다 유연하게 사용할 수 있습니다.

Bash 쉘은 널리 사용되는 쉘 중 하나입니다. 이 쉘은 리눅스나 유닉스 시스템에서 사용되며, 텍스트 기반 명령어 인터페이스를 제공합니다. Bash 쉘은 사용자가 입력한 명령어를 해석하고 실행하는 역할을 합니다. Bash 쉘은 다양한 기능을 제공하는데, 이 중 일부 기능에 대해 알아보겠습니다.

  • allexport: 이 옵션은 현재 쉘에서 실행하는 모든 명령어의 환경 변수를 자동으로 내보내는 역할을 합니다.
  • braceexpand: 이 옵션은 중괄호({})를 사용하여 문자열을 확장하는 역할을 합니다.
  • emacs: 이 옵션은 Bash 쉘의 기본적인 편집기로 설정됩니다.
  • errexit: 이 옵션은 명령어가 실패하면 스크립트를 종료하도록 설정합니다.
  • errtrace: 이 옵션은 함수에서 발생한 오류를 추적하도록 설정합니다.
  • functrace: 이 옵션은 함수가 실행되는 동안 디버깅 정보를 제공합니다.
  • hashall: 이 옵션은 해시 테이블을 사용하여 명령어의 경로를 저장합니다.
  • histexpand: 이 옵션은 사용자의 명령어 히스토리를 활성화하여, 명령어를 확장하거나 수정하는 데 사용됩니다.
  • history: 이 옵션은 사용자의 명령어 히스토리를 저장합니다.
  • ignoreeof: 이 옵션은 Ctrl+D 키를 눌러도 로그아웃되지 않도록 설정합니다.
  • interactive-comments: 이 옵션은 '#' 문자로 시작하는 주석을 허용합니다.
  • keyword: 이 옵션은 쉘에서 사용되는 키워드를 처리하는 방법을 설정합니다.
  • monitor: 이 옵션은 백그라운드 프로세스의 상태를 감시합니다.
  • noclobber: 이 옵션은 '>' 기호를 사용하여 파일을 덮어쓰지 않도록 설정합니다.
  • noexec: 이 옵션은 스크립트를 실행하지 않고 구문 분석만 수행합니다.
  • noglob: 이 옵션은 와일드카드 문자를 비활성화합니다.
  • nolog: 이 옵션은 명령어 히스토리를 기록하지 않도록 설정합니다.
  • notify: 이 옵션은 백그라운드 작업이 완료되었을 때 사용자에게 알립니다.
  • nounset: 이 옵션은 정의되지 않은 변수를 사용할 때 스크립트를 종료하도록 설정합니다.
  • onecmd: 이 옵션은 입력된 명령어를 실행한 후 쉘을 종료합니다.
  • physical: 이 옵션은 심볼릭 링크가 아닌 원본 파일을 참조합니다.
  • pipefail: 이 옵션은 파이프 라인에서 발생한 오류를 추적하도록 설정합니다.
  • posix: 이 옵션은 POSIX 호환 모드에서 쉘을 실행합니다.
  • privileged: 이 옵션은 root 권한으로 실행하는 경우에만 활성화됩니다.
  • verbose: 이 옵션은 실행되는 명령어의 상세 정보를 출력합니다.
  • vi: 이 옵션은 vi 편집기를 사용하여 명령어를 편집합니다.
  • xtrace: 이 옵션은 실행되는 명령어를 출력합니다.

Bash 쉘은 이 외에도 다양한 옵션을 제공합니다. 이러한 옵션을 적절하게 사용하여 쉘 스크립트를 개발하거나 명령어를 실행할 때 효율적으로 작업할 수 있습니다.

 

로그아웃 <Ctrl+D> 방지하기 (ignoreeof)

<Ctrl+D>는 쉘 프롬프트에서 파일의 끝을 알리거나 현재 쉘 프롬프트를 종료하는 역할을 한다. 그러나 <Ctrl+D>를 실수로 누르면 관리자가 작업하던 중 쉘 프롬프트가 종료되면서 로그아웃이 되어버리는 문제가 발생한다.

이 문제를 해결하기 위해서는, ignoreeof라는 쉘 기능을 이용해 로그아웃 방지 기능을 설정해야 한다. 이렇게 설정하면 <Ctrl+D>를 눌러도 로그아웃되지 않고, exit 명령어를 이용해 로그아웃해야 한다.

따라서, 다음과 같은 명령어를 입력하여 ignoreeof 기능을 설정한다.

set -o ignoreeof

이제 <Ctrl+D>는 파일의 끝을 알리는 역할만 수행하며, 쉘 프롬프트를 종료하지 않는다.

<Ctrl+D>의 뜻은 다음과 같다.

① 파일의 끝(EOF) ② 현재 쉘(프로그램) 종료

 

로그아웃 방지 기능

# telnet 192.168.10.252
Trying 192.168.10.252...
Connected to 192.168.10.252.
Escape character is '^]'.

Kernel 3.10.0-1062.el7.x86_64 on an x86_64
server2 login: root
Password:
Last login: Mon Mar 16 15:43:52 from 192.168.10.200
[root@server2 ~]#
[root@server2 ~]# hostname
[root@server2 ~]# id
[root@server2 ~]# ps
[root@server2 ~]# <CTRL + D>
[root@server2 ~]# bash
[root@server2 ~]# set -o | grep ignoreeof
ignoreeof       off
[root@server2 ~]# set -o ignoreeof /* ignoreeof 기능 on */
[root@server2 ~]# <CTRL + D> Use "exit" to leave the shell. /* 로그아웃 기능 */
[root@server2 ~]# exit

시스템에서 원하지 않는 로그아웃을 방지하기 위해서는 다음 단계를 따르십시오:

  1. 먼저, 보통대로 로그인 자격 증명을 입력합니다.
  2. 시스템이 부팅을 마치면 사용자 이름과 암호를 입력하여 로그인합니다.
  3. 로그인한 후 다음 명령을 입력합니다.
set -o ignoreeof

이렇게 하면 ignoreeof 기능이 켜져서 시스템에서의 무작위 로그아웃이 방지됩니다. 4. 기능을 테스트하려면 CTRL+D를 누르십시오. 시스템은 즉시 로그아웃하지 않습니다. 대신 사용자에게 로그아웃 의사를 확인하는 메시지를 보여줍니다. 5. 로그아웃하려면 "exit"를 입력하고 Enter를 누르십시오.

이러한 단계를 따르면 시스템에서 무작위 또는 원하지 않는 로그아웃을 방지할 수 있습니다.

 

사용자 계정의 자동 로그아웃 기능

윈도우에서 사용자가 아무런 동작을 하지 않으면 자동 로그아웃이 되는 기능이 있듯이 Linux에서도 사용자가 지정된 시간동안 아무런 동작을 하지 않으면 자동 로그아웃이 되는 기능이 있다.

▶ /etc/profile 환경 파일 : 모든 사용자에게 적용가능
# vi /etc/profile
...
 HOSTNAME='/bin/hostname'
 ...
 TMOUT=3600          /* 자동 로그아웃 되는 시간 : 초단위로 지정 */
 ...
▶ .bash_profile 환경파일 : 사용자별 홈 디렉토리에 있는 파일을 변경
# vi ~/.bash_profile
...
TMOUT=60             <-- 라인 추가
export PATH TMOUT    /* 지역변수를 환경 변수로 적용 */
...

 

덮어쓰기 방지기능 (noclobber)

방향 재 지정자(Redirection Stdout, '>')를 이용하면 기존에 존재하는 파일이름에 새로운 내용으로 덮어쓰기가 가능 했었다. 중요한 파일의 경우 파일의 이름이 존재하는지 모른 채 덮어쓰기를 할 우려가 있기 때문에 덮어쓰기 방지 기능을 이용하여 중요한 파일등에 덮어쓰기가 되지 않도록 파일의 내용을 보호 할 수가 있다.

set –o noclobber
# set -o | grep noclobber
noclobber       off
# set -o noclobber /* 덮어쓰기 방지 기능 on */
# set -o | grep noclobber
noclobber       on
# echo 1111 > test1 
# echo 2222 > test1 /* 덮어쓰기가 되지 않는다 */
-bash: test1: cannot overwrite existing file
# cat test1
1111
# set +o noclobber/* 덮어쓰기 방지 기능 off */
# echo 2222 > test1 
# cat test1
2222
# set -o noclobber/* 덮어쓰기 방지 기능 on */
# echo 3333 >| test1 /* 덮어쓰기 방지 무시 */
3333

 

파일이름 자동 완성 기능

디렉토리나 파일 이름을 입력할 때, 첫 글자만 입력한 후 Tab키를 누르면 해당 첫 글자로 시작하는 파일 또는 디렉토리의 나머지 이름이 자동으로 완성됩니다. 하지만, 해당 첫 글자로 시작하는 파일 혹은 디렉토리가 여러 개인 경우, Tab키를 한 번만 눌러도 아무 변화도 일어나지 않습니다. 대신에, Tab키를 연속으로 두 번 누르면 해당 첫 글자로 시작하는 모든 파일과 디렉토리 이름이 출력됩니다. 이 방법을 사용하면 쉽게 원하는 파일이나 디렉토리를 찾을 수 있습니다.

 

[명령어 형식]

# ls t[TAB]

위 명령어는 현재 디렉토리 내의 모든 파일과 폴더를 열람할 수 있게 해주는 유용한 명령어입니다. 디렉토리를 열람하면서 작업을 수행할 때 자주 사용하는 명령어 중 하나입니다. 디렉토리 내의 모든 파일과 폴더를 열람하여 작업을 수행하는 데 있어서 매우 유용한 명령어입니다.

 

<TAB> 이용한 디렉토리 이동

# cd /etc/sysco<TAB>
/etc/sysconfig/
# cd /etc/sysconfig/netw<TAB>
/etc/sysconfig/network
# cd /etc/sysconfig/network-s<TAB>
/etc/sysconfig/network-scripts/

디렉토리 이동은 리눅스 명령어 중에서도 기본이 되는 명령어입니다. 디렉토리는 파일과 함께 데이터를 보관합니다. 이 때문에, 디렉토리를 잘 다루는 것은 리눅스 시스템 관리의 기초입니다.

위 예시에서는, cd 명령어를 사용하여 디렉토리를 이동하는 방법을 보여줍니다. /etc/sysconfig/ 디렉토리로 이동하고, /etc/sysconfig/network 디렉토리로 이동하며, /etc/sysconfig/network-scripts/ 디렉토리로 이동하는 과정을 다룹니다. 이러한 디렉토리 이동 명령어들은 시스템 관리자들이 시스템 설정 파일을 관리하고 네트워크 설정을 변경할 때 자주 사용됩니다.

하지만, 명령어를 정확히 입력하는 것이 중요합니다. 오타가 있거나 잘못된 명령어를 입력하면 원치 않는 결과를 초래할 수 있습니다. 따라서, 명령어를 입력하기 전에 한번 더 확인하는 것이 좋습니다.

 

자동 완성 기능이 되지 않을때의 <TAB><TAB> 사용

자동 완성 기능을 사용하는 것이 편리하지만 때로는 작동하지 않는 경우가 있습니다. 이때는 <TAB><TAB>를 사용하여 다른 문자와 구별 할 수 있는 글자까지 적어주고 다시 <TAB>을 눌러 완성시킬 수 있습니다. 예를 들어, 다음과 같이 입력해보세요.

# cd /etc/sys<TAB><TAB>
sysconfig/ sysctl.conf  syslog.conf
# cd /etc/sysco<TAB> /* 다른 문자와 구별 할 수 있는 글자까지 적어주고 다시<Tab>을 누르면 완성 */
/etc/sysconfig

 

<TAB> 이용한 명령어의 종류 확인

다음은 <TAB> 키를 사용하여 액세스할 수 있는 일반적으로 사용되는 명령어 목록입니다:

# ch[TAB][TAB]
chacl               check-binary-files  chmod
chage               checkXML            chown
change_console      checkmodule         chpasswd
charmap             checkpolicy         chroot
chat                chfn                chrt
chattr              chgrp               chsh
chcat               chkconfig           chvt
chcon               chkfontpath
# systemctl [TAB][TAB]
add-requires           hybrid-sleep           reload-or-restart
add-wants              is-active              reload-or-try-restart
cancel                 is-enabled             rescue
cat                    is-failed              reset-failed
condreload             is-system-running      restart
condrestart            isolate                set-default
condstop               kexec                  set-environment
daemon-reexec          kill                   set-property
daemon-reload          link                   show
default                list-dependencies      show-environment
delete                 list-jobs              snapshot
disable                list-sockets           start
edit                   list-timers            status
emergency              list-unit-files        stop
enable                 list-units             suspend
exit                   mask                   switch-root
force-reload           poweroff               try-restart
get-default            preset                 unmask
halt                   reboot                 unset-environment
help                   reenable
hibernate              reload

이러한 명령어는 파일 권한을 변경하거나 시스템 설정을 수정하고 실행 중인 프로세스를 관리하는 등 다양한 작업을 수행하는 데 사용됩니다. <TAB> 키를 사용하여 사용 가능한 명령어에 빠르게 액세스할 수 있으며, 작업을 간소화할 수 있습니다. 일부 명령어는 관리 권한이 필요할 수 있으므로 주의해서 사용해야 합니다.

 

redhat-config-* & system-config-*

단계 1: 참고

redhat-config-* 와 system-config-* 명령어에 대한 참고 내용입니다.

단계 2: 파일 이름 자동 완성 기능

Bash 쉘에서는 Tab 키를 사용하여 파일 이름 자동 완성 기능을 사용할 수 있습니다. 이를 이용하면 긴 파일 이름을 빠르게 입력할 수 있습니다.

예를 들어, 다음과 같이 /etc/sysco 디렉토리로 이동하고자 할 때,

cd /etc/sysco[TAB]

Tab 키를 누르면 /etc/sysconfig로 자동 완성됩니다.

만약 다음과 같이 입력하면

cd /etc/sysco[ESC][\\\\]

[ESC][\\\\] 키를 누르면 /etc/sysco 디렉토리에 있는 모든 파일과 디렉토리 목록이 출력됩니다.

단계 3: 명령행 편집 기능

Bash 쉘에서는 이전에 사용한 명령어를 불러오거나, 명령어를 수정할 수 있는 명령행 편집 기능을 제공합니다.

이전 명령어를 되살려서 쓰는 경우

이전에 사용한 명령어를 그대로 사용하고자 할 때는, ↑ 키나 Ctrl + P 키를 사용합니다. 이전 명령어를 반복해서 사용하고자 할 때는 ↑↑↑ 키나 Ctrl + R 키를 사용합니다.

이전 명령어를 편집해서 사용하는 경우

이전에 사용한 명령어를 수정하거나, 일부만 사용하고자 할 때는, vi 편집기와 비슷한 방식으로 키를 사용합니다.

예를 들어, 다음과 같이 find 명령어를 사용하고자 할 때,

find / -name core –type f

명령어를 입력한 후, 결과를 확인하지 않고 Ctrl + C 키를 누릅니다. 이후, vi 편집기와 비슷한 방식으로 키를 사용하여 명령어를 수정합니다.

 

확인 + 명령어 수행 + 확인

명령어를 실행하기 전에, 명령어의 결과를 먼저 확인하고자 할 때는, 다음과 같이 명령어를 입력합니다.

# chkconfig --list krb5-telnet 
# chkconfig krb5-telnet on

명령어 결과를 확인한 후, 다시 명령어를 입력하고자 할 때는, ↑ 키를 눌러 이전에 입력한 명령어를 불러옵니다.

반응형