posted by 귀염둥이채원 2021. 4. 8. 21:55

; - 앞의 명령어가 실패해도 다음 명령어가 실행
&& - 앞의 명령어가 성공했을 때 다음 명령어가 실행
& - 앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행

# ; - 성공여부와 상관없이 다음 명령어 실행
$ mkdir test; cd test; touch abc

test 디렉토리가 이미 상황이라면 아래와 같은 결과가 된다.
mkdir test(실패); cd test; touch abc
이 경우 cd test가 실행되고, touch abc도 실행된다.

# && - 성공한 경우에 다음 명령어 실행
반면에 아래의 경우는 cd test와 touch abc가 실행되지 않습니다.
$ mkdir test(실패) && cd test && touch abc

# 명령의 그룹핑 {}
$ mkdir test && { cd test3; touch abc; echo 'success!!' } || echo 'There is no dir';
mkdir test가
성공했을 때 cd test2; touch abc를 실행하고 success!!를 출력합니다.
실패했을 때 echo 'There is no dir'를 실행합니다.
이때 실행되는 명령들은 현재 쉘의 컨텍스트에서 실행됩니다. 만약 서브 컨텍스트에서 실행하고 싶다면 '('와 ')'를 사용하시면 됩니다. (참고)

# 명령어의 반환값
리눅스(유닉스)의 모든 명령어는 종료할 때 성공 여부를 알려줍니다.
test 디렉토리가 없는 곳에서 아래 명령을 실행해보세요.
$ mkdir test

그리고 아래 명령을 실행해보세요.
echo $?
이 명령어는 이전 명령어가 반환한 값을 알아내는 것입니다. 결과는 아래와 같습니다.
0

반대로 test 디렉토리가 이미 있는데 mkdir test를 실행한 후에 echo $?를 실행하면 아래 값이 출력됩니다.
1
또는 존재하지 않는 명령어를 실행하면 127이 출력될꺼예요. 즉 리눅스에서는 0이 아닌 값은 실패(false)를 의미합니다.

즉, 리눅스에서는 0이 아닌 값은 실패(false)를 의미


# 참고사이트
https://opentutorials.org/course/2598/15818
http://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html

posted by 귀염둥이채원 2021. 4. 8. 21:00

* 표준출력 : shell에서 실행시 정상 종료시의 메시지로 화면에 출력됨, 파일 디스크립터는 1번
* 표준에러 : shell에서 실행시 발생한 에러 메시지로 화면에 출력됨. 파일 디스크립터는 2번
* /dev/ull : 출력이 파기되어, 아무것도 출력이 되지 않음. (쓰레기통으로 표현됨)
* 2>&1 : 2(표준에러)를 1(표준출력)으로 보내기
* >/dev/null 2>&1 : 앞에 1이 생략 (1>/dev/null 2>&1) → 표준출력,표준에러 다 버려라.

# error.sh

#!/bin/bash

echo "About to try to access a file that doesn't exist"
cat bad-filename.txt


# stdout 및 stderr 모두 리디렉션
./error.sh 1> capture.txt 2> error.txt

# stdout 및 stderr을 동일한 파일로 리디렉션
./error.sh > capture.txt 2&>1


# exam.py

!/usr/bin/env python

import sys

sys.stdout.write("stdout")
sys.stderr.write("stderr")


# stdout을 파일로 redirect
$ ./exam.py > test.txt

# stderr을 refirect하고, stdout만 화면 표시
./exam.py 2> test.txt

# stdout 과 stderr 둘다 파일로 저장
./exam.py 2&> test.txt

# stdout 과 stderr 둘다 화면과 파일로 동시에 redirect
./exam.py 2>&1 | tee test.txt


# 참고사이트
https://stackoverflow.com/questions/637827/redirect-stderr-and-stdout-in-bash

posted by 귀염둥이채원 2021. 4. 8. 20:42

리눅스에서 cat <<EOF에 대해 정리한다.
* Bash 쉘에서 HEREDOC 구문의 전형적인 형식
* 쉘스크립트에서 명령어를 help
* 직접 입력한 텍스트를 파일로 저장시 사용
* 주로 시작 및 종료를 알리는 키워드로 EOF(End of File) 사용하지만 다른것을 사용해도 된다.

# cat을 이용해 여러 줄을 입력하는 방법

$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)

$ echo $sql
SELECT foo, bar FROM db WHERE foo='baz'


# cat을 이용해 여러 줄을 파일(print.sh)로 저장

$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF

$ cat print.sh
#!/bin/bash
echo $PWD
echo /root


# 쉘스크립트에서 print_usage에 사용하기

$ cat test.sh
function print_usage {
cat << EOF
>> Usage: ${0} <name> <date>
Required Arguments:
- name: set name
- date: set date
EOF
}

if [ $# -lt 2 ]; then
print_usage
exit 1
fi

$ ./test.sh kim
>> Usage: ./test.sh <name> <date>
Required Arguments:
- name: set name
- date: set date



# 참고사이트
https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_cat_%E2%89%AAEOF
https://twpower.github.io/142-use-cat-for-multiline-stdin
https://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash

posted by 귀염둥이채원 2019. 1. 22. 19:06

# 그룹 관리 - gpasswd

리눅스 시스템을 사용하는 주체는 두가지로 볼 수 있는데 그것은 사용자이거나 그룹이다. 

특정 그룹에 사용자를 추가하거나 제거하고 특정 그룹에 패스워드를 설정하는 작업은 gpasswd를 이용한다.


# gpasswd 옵션

-a user : 특정 그룹에 새로운 그룹멤버를 추가함.

-d user : 특정 그룹에서 지정한 그룹멤버를 제거함.

-r : 특정 그룹의 패스워드를 제거함

-R : 특정 그룹에 접근을 제한함

-A user, ... : 특정 그룹의 그룹관리자를 설정함

-M user, ... : 특정 그룹의 그룹멤버를 새로 설정함.

위의 옵션들 가운데 -A 와 -M 외의 옵션들은 동시사용이 가능하다.


# 그룹에 사용자를 추가하는 방법 3가지

- vi 명령어로 /etc/group 파일을 편집하여 직접 등록한다.

- gpasswd 명령어의 -M 명령어로 그룹멤버를 직접 설정한다.

- gpasswd 명령어의 -a 옵션으로 새로운 멤버를 추가 등록한다.


# abc 사용자를 project 그룹에 추가

$ gpasswd -a {user} {group}

$ gpasswd -a abc project


# 참고 사이트

https://webdir.tistory.com/134

posted by 귀염둥이채원 2019. 1. 4. 17:56

리눅스 계정(유저) 생성하는 방법입니다.


# 그룹(testgroup) 생성

$ groupadd testgroup


# CentOS에서 testuser 생성

$ useradd -G testgroup testuser

→ CentOS 등 레드햇 계열에서는 아무 옵션을 주지 않아도 홈 디렉토리 생성되고 쉘 환경이 설정됨


# Ubuntu에서 testuser 생성

$ useradd testuser -m -s /bin/bash

→ -m 옵션을 명시해야 홈 디렉토리가 생성됨

→ -s /bin/bash 옵션을 명시해야 쉘 환경이 설정됨


# testuser 비밀번호 생성

$ password testuser


# testuser로 전환

$ su - testuser


# group 확인

$ cat /etc/group


# 전체 user 확인

$ cat /etc/passwd


# 계정이 존재하는지 확인

$ cat /etc/passwd | grep testuser

posted by 귀염둥이채원 2018. 11. 21. 01:25

# 특정 문자열을 찾아 변경하는 방법

find -name "*.conf" | xargs sed s/찾을단어/원하는단어/g -i

위의 명령어는 *.conf 파일을 찾아서 내용중에 찾을단어를 원하는 단어로 변경.


vi 에서는

:%s/기존문자열/새문자열

 

# find 명령어 사용법 예시


파일명 찾기

find ./ -name 찾을파일명


# 파일의 특정 소유자 찾기. ex) nobody

find ./ -user 찾을파일명


10kb~100kb 인 파일찾기

find ./ -size +10k -size 100k


확장자가 conf 인 파일 지우기

find ./ -name "*.conf" -exec rm {} \;


퍼미션 777 파일 찾기

find ./ -type f -perm 0777


하위디렉터리를 제외한 현재 디렉토리에서 tar.gz 파일 

find ./ -maxdepth 1 -name "*.tar.gz"                                                               


찾아서 크기가 큰순으로 정렬

find ./ -maxdepth 2 -name "*.tar.gz" | xargs ls -l -SSr -h