바로 이전 디렉토리로 이동하려면 cd - 를 사용한다.


그러나 바로 이전 디렉토리가 어디있지 출력하고 싶을 때는..  다음 커맨드를 사용한다.


echo ~-


현재 디렉토리는 다음 커맨드를 사용한다.


echo ~+



$ echo ~+

/temp

$ echo ~-

/usr/local/redis/src


'unix and linux' 카테고리의 다른 글

닷 커맨드(마침표 커맨드) : .  (0) 2017.02.23
널 커맨드 - :  (0) 2017.02.23
[bash] stty tostop  (0) 2017.02.20
typeset 커맨드  (0) 2017.02.17
[bash] history를 관리하는 툴 fc  (0) 2017.02.17
Posted by '김용환'
,

[bash] stty tostop

unix and linux 2017. 2. 20. 18:54


백그라운드로 실행한 작업이 있는데,

계속 로그 출력이 계속되면 좀 거슬릴 수 있다. 


백그라운드 작업을 한번에 중지하려면 stty tostop을 사용한다. 




$ ./sleep.sh


echo 1

sleep 1

echo 1

sleep 1

echo 1

sleep 1

...


$./sleep.sh  &




$ stty tostop


[1]+  Stopped                 ./sleep.sh




'unix and linux' 카테고리의 다른 글

널 커맨드 - :  (0) 2017.02.23
[bash] 바로 이전 디렉토리 확인하기  (0) 2017.02.20
typeset 커맨드  (0) 2017.02.17
[bash] history를 관리하는 툴 fc  (0) 2017.02.17
라인 편집기 모드를 vi로 적용하기 (set -o vi)  (0) 2017.02.15
Posted by '김용환'
,

typeset 커맨드

unix and linux 2017. 2. 17. 17:22




유닉스에는 typeset에 존재해서

변수에 값에 대한 타입을 지정할 수 있다.


예를 들어 정수라면 다음처럼 값 할당을 진행할 수 있고 

만약 bash의 경우는 문자는 정수에 할당되는데, 정수와 문자가 함께 저장되는 것은 안된다. 


정수 예시

$ typeset -i i

$ i=2

$ echo $i

2

$ i="aa"

$ echo $i

0

$ i=1m

-bash: 1m: value too great for base (error token is "1m")



배열 예시

$ typeset -i array

$ array[0]=1

$ array[1]=2

$ array[3]=4

$ echo ${array[*]}

1 2 4




정수, readonly(-r), 배열(-a), 함수(-f) 등을 사용할 수 있다. 


http://www.tldp.org/LDP/abs/html/declareref.html

Posted by '김용환'
,


fc 커맨드를 사용하면 마지막으로 사용했던 커맨드를 vi로 편집한다.


$ fc

..


fc -l을 실행하며 최근 16개만 보여준다.


$ fc -l

..



최근 5개 커맨드를 보려면 다음 커맨드를 실행한다.


$ fc -l -5

커맨드 번호 ...

커맨드 번호 ...

커맨드 번호 ...

커맨드 번호 ...



커맨드 번호를 보고 싶지 않다면 -n을 추가한다.


$ fc -n -l -5

..

..

..




Posted by '김용환'
,




.bash_profile에 다음을 추가한다.


set -o vi


vi 대신 emac를 사용할 수 있다.



$source ~/.bash_profile



vi 쓰듯이 편집기를 사용할 수 있다. 




Esc를 누르면 커맨드 모드로 입력된다 .h와 l, w, b, 0, ^, $ 기본적인 커맨드를 사용해 커서를 움직일 수 있고

위 아래인 j, k는 커맨드 히스토리를 최근부터 찾는다. 

/를 누르면 커맨드 히스토리에서 검색할 수 있다.



커맨드

의미

h

왼쪽으로 한 글자씩 이동한다.

l

오른쪽으로 한 글자씩 이동한다.

b

왼쪽으로 한 단어씩 이동한다.

w

오른쪽으로 한 단어씩 이동한다.

o

라인의 시작으로 이동한다.

$

라인의 끝으로 이동한다.

x

커서의 글자를 삭제한다.

dw

커서의 단어를 삭제한다.

rc

커서의 글자를 c로 변경한다.

a

입력 모드로 진입해 현재 글자 뒤에 글자를 추가한다.

i

입력 모드로 진입해 현재 글자 앞에 글자를 추가한다.

k

커맨드 히스토리에서 이전 커맨드를 얻는다.

j

커맨드 히스토리에서 이후 커맨드를 얻는다.

/string

커맨드 히스토리에서 string을 포함한 가장 최근에 실행한 커맨드를 찾는다. string이 null이면 바로 이전에 실행한 커맨드를 얻는다.



set -o vi를 하지 않으면 디폴트로 emac를 라인 편집기로 사용한다.



커맨드

의미

Ctrl+b

왼쪽으로 한 글자씩 이동한다.

Ctrl+f

오른쪽으로 한 글자씩 이동한다.

Esc f

왼쪽으로 한 단어씩 이동한다.

Esc b

오른쪽으로 한 단어씩 이동한다.

Ctrl+a

라인의 시작으로 이동한다.

Ctrl+e

라인의 끝으로 이동한다.

Esc d

커서의 글자를 삭제한다.

erase char

커서의 단어를 삭제한다.

Ctrl+p

커맨드 히스토리에서 이전 커맨드를 얻는다.

Ctrl+n

커맨드 히스토리에서 이후 커맨드를 얻는다.

Ctrl+r string

커맨드 히스토리에서 string을 포함한 가장 최근에 실행한 커맨드를 찾는다.


Posted by '김용환'
,



쉘 스크립트에서 >와 <는 리디렉션(redirection)을 의미한다. 표준 출력과 입력을 리디렉션할 때 사용한다.



test.sh > /dev/null


cp file-name > /dev/null


>1은 커맨드의 표준 출력을 다음에 나오는 파일 디스크립터에 전달한다.


$ ls b* >1 m.log

$ cat m.log

...


>2는 쉘 스크립트의 표준 에러를 다음에 나오는 파일 디스크립터에 전달한다.


$ ls zzz*

ls: zzz*: No such file or directory

$ ls zzz* 2> m.log

$ cat m.log

ls: zzz*: No such file or directory




>&2는 모든 출력을 강제로 쉘 스크립트의 표준 에러로 출력한다. 


$ echo "ho" >&2

ho



자주 혼동되긴 하지만  형태로만 봤을 때 파일 디스크립터의 유무가 크다. 



하나의 커맨드에 동시에 표준 출력과 표준 입력을사용하려면 다음과 같다. >를 사용해서 먼저 결과를 로그 파일에 저장하고 2>>는 표준 에러의 결과를 log에 추가하라는 의미이다. 


$ ls -zzz* > log 2>> log

$ cat log

ls: illegal option -- z

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]



이보다 더 좋은 축약형은 2>&1이다. 많이 봐서 알 수 있을 것이다.


$ ls -zzz* > log 2>&1

$ cat log

ls: illegal option -- z

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]



순서를 바꾸면 어떤 일이 벌어질까? 제대로 동작되지 않는다. 

왼쪽에서 오른쪽으로 파싱을 하는데, 표준 에러가 표준 출력보다 먼저 나오기 때문에 표준 에러를 표준 출력으로 보내고 표준 출력은 log로 저장하려는 시도가 되지 않는다.  또한 ls -zzz* 1>&2 > log도 동작되지 않는다.


$ ls -zzz* 2>&1 > log

ls: illegal option -- z

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]



여기서, tee를 이용하면 표준 출력와 표준 에러의 내용이 로그 파일도 나오게 하고 콘솔에도 나오게 하고 싶을 수 있다. 

$ ls -zzz* 2>&1 | tee log

ls: illegal option -- z

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]



exec를 사용하면 쉘에서 모든 표준 입력과 출력을 모두 특정 파일로 보낼 수 있다.  >는 표준 출력, 2>는 표준 에러를 의미한다.


[~/temp] exec > ~/temp/log1

[~/temp] ls -al

[~/temp] sadf

-bash: sadf: command not found

[~/temp] ls -al ~/temp/log1



다른 터미널에서 확인해본다.


$ cat ~/temp/log1

...


Posted by '김용환'
,


쉘에서 변수 대체에서의 패턴은 조금 특별히 봐야 한다.



패턴 매칭 구문은 하나의 변수 이름(또는 매개 변수 번호)과 하나의 패턴, 두 개의 매개 변수를 받는다. 쉘은 주어진 패턴과 일치하는 주어진 변수의 내용을 검색한다. 패턴이 일치하면 쉘은 커맨드 라인에서 패턴의 일치하는 부분을 삭제한 채 변수 값을 사용한다. 패턴이 일치하지 않으면 커맨드 라인에서 변수의 전체 내용을 사용한다. 두 경우 모두 변수의 내용이 변경되지 않는다.


패턴은 네 가지가 있다.



${variable%pattern}

쉘은 특정 pattern으로 끝나는지 확인하기 위해 내부 variable를 살펴본다. 패턴과 일치하면 variable의 내용이 사용되고 가장 짧게 일치하는 pattern 패턴을 오른쪽부터 제거한다.


예시는 다음과 같다.


[~] s="boys, be ambitious"

[~] echo $s

boys, be ambitious

[~] echo ${s%am*s}

boys, be

[~] echo ${s%b*s}

boys, be am

[~] echo ${s%%b*s}


[~] echo ${s%s}

boys, be ambitiou

[~] echo ${s%i*s}
boys, be ambit


${variable%%pattern}

쉘은 특정 pattern으로 끝나는지 확인하기 위해 variable 내부를 다시 살펴본다. 그러나 이번에는 가장 길게 일치하는 pattern을 오른쪽부터 제거한다. pattern에 *가 사용되는 경우에만 관련이 있다. 그렇지 않으면 %와 %%는 같은 방식으로 작동한다.


[~] s="boys, be ambitious"

[~] echo $s

boys, be ambitious

[~] echo ${s%%am*s}

boys, be

[~] echo ${s%%b*s}


[~] echo ${s%%s}
boys, be ambitiou

[~] echo ${s%%i*s}

boys, be amb




% 구문과 %% 구문의 경우 변수 값은 지정된 패턴으로 끝나야 한다.




${variable#pattern}

커맨드 라인에서 variable의 값을 사용하고 왼쪽부터 패턴을 제거한다.


예시는 다음과 같다.


[~] s="boys, be ambitious"

[~] echo $s

boys, be ambitious

[~] echo ${s#b}

oys, be ambitious

[~] echo ${s#b*s}

, be ambitious



${variable##pattern}

pattern의 가장 긴 항목이 왼쪽에서 제거된다는 점을 제외하고 # 형식과 유사하다.


예시는 다음과 같다. 


[~] s="boys, be ambitious"

[~] echo $s

boys, be ambitious

[~] echo ${s##b}

oys, be ambitious

[~] echo ${s##b*s}



 # 구문과 ## 구문의 경우 변수는 해당 변수로 시작해야 한다.







Posted by '김용환'
,


쉘 스크립트에서 set -x 하면 추적 기능이 생겨서 표준 에러로 커맨드를 출력한다. 

출력할 때는 + 기호가 앞에 붙는다. 만약 추적 기능을 쓰지 않으려면 set +x를 사용한다.




[~] set -x


[~] echo $x

+ echo aaaaa

aaaaa


[~] env

+ env


[~] ls -al | awk '{print $1}

> '

+ ls -al

+ awk '{print $1}

'


[~] set +x

+ set +x

[~] ls -al | awk '{print $1}'



추적 옵션은 서브쉘에 전달이 되지 않는다. 따로 커맨드를 실행해야 한다. 


$ set -x test.sh



Posted by '김용환'
,



변수 이름에 중괄호를 사용하면 다른 문자들로부터 변수를 보호할 수 있다. 


$ echo $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home

$ echo $JAVA_HOMEs


$ echo ${JAVA_HOME}s
/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Homes


그리고 변수 명의 값이 널이면 기본 문자열을 추가할 수 있다.


$ echo ${JAVA_HOME:-no java home}

/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home

$ echo ${JAVA_HOME1:-no java home}

no java home



변수의 값에 따라 항상 변경된다.


$ echo ${x:-not defined}

1

$ x=

$ echo ${x:-not defined}

not defined


'unix and linux' 카테고리의 다른 글

[shell] 변수 대체의 패턴 - %, %%, #, ##  (0) 2017.02.04
[shell] 쉘 스크립트 추적하기 - set -x/set +x  (0) 2017.02.03
export -p  (0) 2017.01.31
프롬프팅(prompting) PS1, PS2  (0) 2017.01.31
echo 이스케이프 - \c  (0) 2017.01.23
Posted by '김용환'
,

export -p

unix and linux 2017. 1. 31. 10:14



export -p를 실행하면 쉘에서 export 변수와 export 변수의 값을 나열한다.



$ export –p

export LOGNAME=samuel.kim

export PATH=/bin:/usr/bin:.

export TIMEOUT=600

export TZ=EST5EDT


$ export xxx=1


$ export –p

export LOGNAME=samuel.kim

export PATH=/bin:/usr/bin:.

export TIMEOUT=600

export TZ=EST5EDT

export xxx=1


Posted by '김용환'
,