Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Magic ~:5개의 예제가 포함된 Bash Tilde 확장

Magic ~:5개의 예제가 포함된 Bash Tilde 확장 Bash 셸은 물결표 확장이라고 하는 '~' 접두사가 붙은 일부 변수를 제공합니다.

쉘 내 다른 변수의 내용에 대한 동의어입니다.

물결표 확장은 이러한 약어를 해당 약어가 나타내는 디렉토리 이름으로 변환하는 프로세스입니다. 이 기사에서는 예제와 함께 물결표 확장 기능을 검토해 보겠습니다.

물결표 확장은 '~'에 적용되며 +, – 및 N(정수)이 최대 공백 또는 슬래시까지 포함됩니다. .

물결표 확장은 여러 특정 경로 이름으로 확장하는 데 사용됩니다.

  • 홈 디렉토리
  • 현재/이전 작업 디렉토리
  • 디렉토리 스택의 디렉토리.

홈 디렉토리

물결표 확장은 현재 사용자의 홈 디렉터리 또는 지정된 사용자 이름의 홈 디렉터리를 확장하는 방법을 제공합니다.

Syntax

~ Expand to the variable $HOME or home directory of the current user

~USER Expand to the home directory of the given username

예 1. 현재 사용자 홈

물결표(~)는 별도의 단어로 정의되어 있으면 $HOME으로 확장되고, $HOME이 정의되어 있지 않으면 현재 사용자의 홈 디렉토리로 확장됩니다.

이제 HOME 변수의 값은 /home/oracle이므로 cd ~는 현재 디렉토리를 $HOME의 값으로 변경했습니다.

<센터>
## Logging into a oracle user, whose home directory is /home/oracle
# su oracle
[tmp]$ pwd
/tmp

[tmp]$ echo $HOME
/home/oracle

[tmp]$ cd ~

[~]$ pwd
/home/oracle

HOME은 /sbin으로 변경되며 cd ~는 사용자의 홈 디렉토리가 아닌 $HOME만 사용합니다. $HOME의 값을 설정 해제한 후 cd ~는 디렉토리를 /etc/passwd에 있는 oracle 사용자에 대해 설정된 홈 디렉토리 값으로 변경했습니다. 물결표 확장의 경우 HOME이 실제 홈 디렉토리보다 우선합니다.

[~]$ export HOME=/sbin

[oracle]$ cd ~

[~]$ pwd
/sbin

[~]$ unset HOME

[sbin]$ cd ~

[oracle]$ pwd
/home/oracle

예시 2. 주어진 사용자의 홈 디렉토리

다음 스크립트는 이름에 현재 날짜가 있는 로그 파일을 백업합니다. 또한 Oracle 사용자의 홈 디렉토리에 있는 backup.log라는 파일에 시작 시간과 종료 시간을 기록합니다.

#! /bin/bash

echo "Initiating the backup at `date`" >> ~oracle/backup.log

da=`date +%F`
cp $da.log{,.bak}

echo "END BACKUP at `date`" >> ~oracle/backup.log

$ ls -l /home/oracle/
total 8
-rw-r--r-- 1 root   root       99 Jun  4 14:23 backup.log

주어진 사용자 이름이 존재하지 않으면 무언가로 확장되지 않습니다. 다음 예에서는 ora라는 사용자가 없습니다. 따라서 ~ora는 /home/ora로 확장되지 않습니다.

$ echo ~ora
~ora

bash에서 중괄호 확장을 수행하는 방법을 이해하려면 이전 기사를 참조하십시오. 즉, bash에서 { }를 사용하는 방법입니다.

작업 디렉토리

+ 및 -가 있는 물결표는 작업 디렉토리를 나타내는 데 사용됩니다.

  • ~+는 현재 작업 디렉토리를 보유하는 PWD 변수의 값으로 확장됩니다.
  • ~- 이전 작업 디렉토리를 보유하는 OLDPWD 변수의 값으로 확장합니다. OLDPWD가 설정되지 않으면 ~-가 확장되지 않습니다.

예시 3. 이전/현재 작업 디렉토리 확장

다음 예는 현재 디렉토리와 이전 작업 디렉토리에 있는 파일을 비교합니다.

$ cat comp.sh
#! /bin/bash

set -x
cd /var/opt/gg
if [ -f gg.c ]
then
echo "File1 exists"
fi

cd /var/opt1/gg
if [ -f gg.c ]
then
echo "File2 exists"
cmp ~+/gg.c ~-/gg.c
fi

$ ./comp.sh
+ cd /var/opt/gg
+ '[' -f gg.c ']'
+ echo 'File1 exists'
File1 exists
+ cd /var/opt1/gg
+ '[' -f gg.c ']'
+ echo 'File2 exists'
File2 exists
+ cmp /var/opt1/gg/gg.c /var/opt/gg/gg.c
cmp: EOF on /var/opt1/gg/gg.c
$

위의 실행에서:

  • ~+/gg.c가 /var/opt1/gg/gg.c로 확장됩니다.
  • ~-/gg.c가 /var/opt/gg/gg.c로 확장됨

이 기사는 진행 중인 Bash Tutorial 시리즈의 일부입니다.

스택의 디렉토리 확장

각 bash 프로세스에는 디렉토리 내용의 데이터를 처리하는 동안 스크립트가 방문한 디렉토리를 추적하는 데 사용할 수 있는 스택 개체가 포함되어 있습니다.

디렉토리를 참조하거나 이전에 방문했던 디렉토리로 다시 변경하는 것은 매우 간단한 메커니즘입니다. 물결표 확장은 디렉토리 스택의 디렉토리에 대한 확장도 제공합니다.

  • ~+N 0부터 시작하여 디렉토리 스택의 N번째 디렉토리를 확장합니다(옵션 없이 호출될 때 dirs에 의해 인쇄된 목록의 왼쪽부터 계산).
  • ~-N 0부터 시작하여 디렉토리 스택의 N번째 디렉토리(옵션 없이 호출될 때 dirs에 의해 인쇄된 목록의 오른쪽부터 계산)를 확장합니다.

이전 기사를 검토하여 dirs, pushd 및 popd 명령을 사용하여 디렉토리 스택을 조작하는 방법을 이해하십시오.

예 4. ~+를 사용하여 왼쪽에서 N번째 디렉토리 표시

다음 예에서 디렉토리 스택에는 4개의 디렉토리가 있습니다. ~+2는 0부터 시작하여 왼쪽에서 두 번째 위치에서 사용 가능한 디렉토리 경로를 제공합니다.

$ dirs -v
 0  /sbin
 1  /var/opt/midas
 2  /var/opt/GG/bin
 3  /root

$ cd ~+2

$ pwd
/var/opt/GG/bin

그러나 스택의 맨 위(제로 위치)에는 항상 현재 디렉토리가 있습니다. 따라서 위의 실행 후 디렉토리 스택에 다음과 같이 표시됩니다.

$  dirs -v
 0  /var/opt/GG/bin
 1  /var/opt/midas
 2  /var/opt/GG/bin
 3  /root

예 5. ~-를 사용하여 오른쪽에서 N번째 디렉토리 표시

다음은 위의 예와 유사합니다. 그러나 ~- 때문에 스택의 맨 아래부터 디렉토리를 고려합니다.

$ dirs -v
 0  /var/opt/GG/bin
 1  /var/opt/midas
 2  /var/opt/GG/bin
 3  /root

$ cd ~-2

$ pwd
/var/opt/midas

$ dirs -v
 0  /var/opt/midas
 1  /var/opt/midas
 2  /var/opt/GG/bin
 3  /root