반응형

출처 : https://stackoverflow.com/questions/29244351/how-to-sort-a-file-in-place/29244387

파일 자체를 정렬하는 방법

sort file 명령을 사용할 때, 파일의 내용을 정렬하여 보여줍니다. 어떤 종류의 출력이 아니라 정렬된 파일을 원하는 데 어떻게 해야 합니까?


7개 답변 중 1개

당신은 정렬된 출력으로 파일 redirection을 사용할 수 있습니다.

sort input-file > output_file
sort 입력파일 > 출력파일

아니면 당신은 -o, --output=FILE 옵션을 같은 입력과 출력 파일을 가리키며 정렬하여 사용할 수 있습니다.

sort -o file file
sort -o 파일 파일

파일 이름을 반복하지 않고 ( bash 중괄호 확장 으로 )

sort -o file{,}
sort -o 파일{,}

참고: 일반적인 실수는 출력을 동일한 입력 파일로 redirect 하는 것입니다(예: sort file > file). 이것은 쉘이 redirection(sort(1) 프로그램이 아님)을 하고 있기 때문에 작동하지 않으며, sort(1) 프로그램에 읽을 기회를 주기 직전에 입력 파일(출력이기도 함)이 지워집니다.

반응형
반응형

출처 : https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/

Rsync (원격 동기화): 리눅스에서 Rsync 명령의 10가지 실용적인 예시

Rsync (원격 동기화)리눅스/유닉스 시스템에서 로컬 뿐만이 아니라 원격으로 파일과 디렉터리를 복사하고 동기화하는데 가장 보편적으로 사용되는 명령입니다. rsync 명령의 도움으로 당신은 당신의 데이터를 로컬과 원격으로 디렉터리, 디스크, 네트워크 상에서 복사하고 동기화할 수 있고 두 리눅스 머신 간에 백업과 미러링을 할 수 있습니다.

이 글은 파일을 리눅스 기반의 머신에서 로컬과 원격으로 파일을 전송하는 rsync 명령의 10개의 기본적이고 고급 사용법을 설명합니다. rsync 명령을 실행하는 데 root 사용자일 필요는 없습니다.

Rsync 명령의 장점과 특징

  • 원격 시스템부터 또는 원격으로 파일을 효율적으로 복사하고 동기화 합니다.
  • 링크, 장치, 소유자, 그룹, 권한 복사를 지원합니다.
  • rsync는 파일의 두 집합 사이에 차이점만 전송하는 원격 갱신 프로토콜을 사용하기 때문에 scp (Secure Copy) 보다 빠릅니다. 처음에는 파일 또는 디렉토리의 전체 내용을 소스에서 대상으로 복사하지만 다음부터는 변경된 블록과 바이트만 대상으로 복사합니다.
  • Rsync는 압축 및 압축 해제 방식을 사용하여 데이터를 송수신하면서 대역폭을 덜 소모합니다.

rsync 명령의 기본 문법

# rsync 옵션 원본 대상
# rsync options source destination

명령에서 사용되는 몇 가지 공통 옵션

  • -v : 자세한 설명 출력
  • -r : 데이터를 재귀적으로 복사합니다(그러나 데이터를 전송하는 동안 타임스탬프와 권한을 유지하지 않습니다.)
  • -a : 아카이브 모드, 아카이브 모드는 파일을 재귀적으로 복사할 수 있으며 심볼릭 링크, 파일 권한, 사용자 및 그룹 소유권 및 타임스탬프도 보존합니다.
  • -z : 파일 데이터 압축
  • -h : 사람이 읽을 수 있는 형식의 출력 숫자

추천 읽기: 비표준 SSH 포트와 함께 Rsync를 사용하여 파일/디렉토리를 동기화하는 방법

리눅스 머신에서 rsync 설치하기

다음 명령으로 rsync 패키지를 설치할 수 있습니다.

# yum install rsync (Red Hat 기반 시스템에서)
# apt-get install rsync (On Debian 기반 시스템에서)

1. 로컬에서 파일과 디렉터리 복사/동기화 하기

로컬 컴퓨터에서 파일 복사/동기화 하기

다음 명령어는 로컬에서 한 위치에서 다른 위치로 하나의 파일을 동기화할 것입니다. 여기 이 예시에서 파일 이름 backup.tar/tmp/backups 폴더로 복사되거나 동기화될 것입니다.

[root@tecmint]# rsync -zvh backup.tar /tmp/backups/

created directory /tmp/backups

backup.tar

위 예시에서 목적지(/tmp/backups)가 아직 없다면 rsync는 자동으로 목적지에 디렉터리를 만들 것입니다.

로컬 컴퓨터에서 디렉터리 복사/동기화 하기

다음 명령어는 같은 머신에서 한 디렉터리에서 다른 디렉터리로 모든 파일을 동기화하거나 전송할 것입니다. 여기 이 예시에서 /root/rpmpkgs는 몇 개의 rpm 패키지 파일을 포함하며 /tmp/backups 폴더로 복사될 것입니다.

[root@tecmint]# rsync -avzh /root/rpmpkgs /tmp/backups/

sending incremental file list

rpmpkgs/

rpmpkgs/httpd-2.2.3-82.el5.centos.i386.rpm

rpmpkgs/mod_ssl-2.2.3-82.el5.centos.i386.rpm

rpmpkgs/nagios-3.5.0.tar.gz

rpmpkgs/nagios-plugins-1.4.16.tar.gz

sent 4.99M bytes  received 92 bytes  3.33M bytes/sec

total size is 4.99M  speedup is 1.00

2. 서버에서 또는 서버로 파일과 디렉터리 복사/동기화 하기

로컬 서버에서 원격 서버로 디렉터리 복사하기

이 명령은 로컬 머신에서 원격 머신으로 디렉터리를 동기화 합니다. 예시: 로컬 컴퓨터에 몇개의 RPM 패키지를 포함하는 "rpmpkg" 폴더가 있습니다. 로컬 디렉터리의 내용을 원격서버로 보내고 싶으시면, 다음 명령을 사용할 수 있습니다.

[root@tecmint]$ rsync -avz rpmpkgs/ root@192.168.0.101:/home/

root@192.168.0.101's password:

sending incremental file list

./

httpd-2.2.3-82.el5.centos.i386.rpm

mod_ssl-2.2.3-82.el5.centos.i386.rpm

nagios-3.5.0.tar.gz

nagios-plugins-1.4.16.tar.gz

sent 4993369 bytes  received 91 bytes  399476.80 bytes/sec

로컬 서버에서 원격 서버로 디렉터리의 특정 파일만 복사하기(역자추가)

여기 예시로 로컬 컴퓨터에 몇개의 RPM 패키지를 포함하는 "rpmpkg" 폴더가 있습니다. 로컬 디렉터리의 확장자가 rpm인 파일만을 원격서버로 보내고 싶으시면, 다음 명령을 사용할 수 있습니다.

[root@tecmint]$ rsync -avz rpmpkgs/*.rpm root@192.168.0.101:/home/

root@192.168.0.101's password:

sending incremental file list

./

httpd-2.2.3-82.el5.centos.i386.rpm

mod_ssl-2.2.3-82.el5.centos.i386.rpm

sent ? bytes  received ? bytes  ? bytes/sec

원격 디렉터리를 로컬 머신으로 복사/동기화 하기

이 명령은 당신이 원격 디렉터리를 로컬 디렉터리로 동기화 하도록 도움을 줄 것입니다. 여기 예시로 원격서버에 있는 디렉터리 /home/tarunika/rmpkgs는 당신의 로컬 컴퓨터의 /tmp/myrpms로 복사될 것입니다.

[root@tecmint]# rsync -avzh root@192.168.0.100:/home/tarunika/rpmpkgs /tmp/myrpms

root@192.168.0.100's password:

receiving incremental file list

created directory /tmp/myrpms

rpmpkgs/

rpmpkgs/httpd-2.2.3-82.el5.centos.i386.rpm

rpmpkgs/mod_ssl-2.2.3-82.el5.centos.i386.rpm

rpmpkgs/nagios-3.5.0.tar.gz

rpmpkgs/nagios-plugins-1.4.16.tar.gz

sent 91 bytes  received 4.99M bytes  322.16K bytes/sec

total size is 4.99M  speedup is 1.00

3. SSH를 통한 RSync

rsync로 우리는 데이터 전송을 위해 SSH (Secure Shell) 을 사용할 수 있습니다. SSH 프로토콜을 사용하면 데이터가 전송되는 동안 아무도 읽을 수 없도록 암호화된 보안 연결로 데이터가 인터넷의 유선을 통해 전송되고 있음을 확인할 수 있습니다.

또한 우리가 rsync를 사용할 때 특정한 작업을 성공하기 위해 user/root 비밀번호를 제공할 필요가 있습니다. SSH 옵션을 사용하여 암호화된 방법으로 로그인하여 전송할 수 있고 당신의 비밀번호는 안전할 것입니다.

SSH로 원격 서버에서 로컬 서버로 파일 복사하기

rsync로 프로토콜을 지정하기 위해 "-e" 옵션을 당신이 사용하기 원하는 프로토콜 이름을 함께 제공할 필요가 있습니다. 여기 예시에서 "-e" 옵션으로 "ssh" 를 사용하여 데이터 전송을 수행할 것입니다.

[root@tecmint]# rsync -avzhe ssh root@192.168.0.100:/root/install.log /tmp/

root@192.168.0.100's password:

receiving incremental file list

install.log

sent 30 bytes  received 8.12K bytes  1.48K bytes/sec

total size is 30.74K  speedup is 3.77

SSH로 로컬 서버에서 원격 서버로 파일 복사하기

[root@tecmint]# rsync -avzhe ssh backup.tar root@192.168.0.100:/backups/

root@192.168.0.100's password:

sending incremental file list

backup.tar

sent 14.71M bytes  received 31 bytes  1.28M bytes/sec

total size is 16.18M  speedup is 1.10

추천 읽기: 리눅스에서 새로운 또는 변경/수정된 파일을 동기화하기 위해 Rsync 사용하기

4. rsync로 데이터 전송하는 동안 진행상태 보기

하나의 머신에서 다른 머신으로 데이터가 전송되는 동안 진행상태를 보기 위해 우리는 '--progress' 옵션을 사용할 수 있습니다. 이것은 파일과 전송을 완료하는 데 남은 시간을 표시합니다.

[root@tecmint]# rsync -avzhe ssh --progress /home/rpmpkgs root@192.168.0.100:/root/rpmpkgs

root@192.168.0.100's password:

sending incremental file list

created directory /root/rpmpkgs

rpmpkgs/

rpmpkgs/httpd-2.2.3-82.el5.centos.i386.rpm

           1.02M 100%        2.72MB/s        0:00:00 (xfer#1, to-check=3/5)

rpmpkgs/mod_ssl-2.2.3-82.el5.centos.i386.rpm

          99.04K 100%  241.19kB/s        0:00:00 (xfer#2, to-check=2/5)

rpmpkgs/nagios-3.5.0.tar.gz

           1.79M 100%        1.56MB/s        0:00:01 (xfer#3, to-check=1/5)

rpmpkgs/nagios-plugins-1.4.16.tar.gz

           2.09M 100%        1.47MB/s        0:00:01 (xfer#4, to-check=0/5)

sent 4.99M bytes  received 92 bytes  475.56K bytes/sec

total size is 4.99M  speedup is 1.00

5. --include 와 --exclude 옵션 사용하기

이 두 가지 옵션을 사용하면 매개변수를 지정하여 파일을 포함제외할 수 있습니다. 이 옵션은 동기화에 포함할 파일 또는 디렉터리를 지정하고 전송을 원하지 않는 파일 및 폴더를 제외하는 데 도움이 됩니다.

여기 예시로 rsync 명령은 'R' 로 시작하는 파일이나 디렉터리를 포함하며 모든 다른 파일과 디렉터리는 제외될 것입니다.

[root@tecmint]# rsync -avze ssh --include 'R*' --exclude '*' root@192.168.0.101:/var/lib/rpm/ /root/rpm

root@192.168.0.101's password:

receiving incremental file list

created directory /root/rpm

./

Requirename

Requireversion

sent 67 bytes  received 167289 bytes  7438.04 bytes/sec

total size is 434176  speedup is 2.59

6. --delete 옵션 사용하기

파일 또는 디렉토리가 원본에 없지만 대상에는 이미 존재하는 경우 동기화하는 동안 대상에서 기존 파일/디렉토리를 삭제할 수 있습니다.

'-delete' 옵션을 사용하여 원본 디렉토리에 없는 파일을 삭제할 수 있습니다.

원본와 대상은 동기화 됩니다. 이제 대상에서 새 파일 test.txt가 만들어 집니다.

[root@tecmint]# touch test.txt
[root@tecmint]# rsync -avz --delete root@192.168.0.100:/var/lib/rpm/ .
Password:
receiving file list ... done
deleting test.txt
./
sent 26 bytes  received 390 bytes  48.94 bytes/sec
total size is 45305958  speedup is 108908.55

대상에는 test.txt((라는 새 파일이 있으며 **'–delete' 옵션으로 소스와 동기화하면 test.txt 파일이 제거됩니다.

7. 전송될 파일의 최대 크기 설정

전송되거나 동기화될 파일의 (최대) 크기를 지정할 수 있습니다. "--max-size" 옵션과 함께 최대 크기를 지정할 수 있습니다. 여기 예시로 최대 파일 크기는 200k 이며, 이 명령은 200k 보다 같거나 작은 파일만 전송할 것입니다.

[root@tecmint]# rsync -avzhe ssh --max-size='200k' /var/lib/rpm/ root@192.168.0.100:/root/tmprpm

root@192.168.0.100's password:

sending incremental file list

created directory /root/tmprpm

./

Conflictname

Group

Installtid

Name

Provideversion

Pubkeys

Requireversion

Sha1header

Sigmd5

Triggername

__db.001

sent 189.79K bytes  received 224 bytes  13.10K bytes/sec

total size is 38.08M  speedup is 200.43

8. 성공적인 전송 후에 원본 파일 자동으로 지우기

메인 웹 서버와 데이터 백업 서버가 있다고 가정하면, 매일 백업을 생성하고 당신의 백업서버로 동기화 하면 이제 당신의 웹 서버에 있는 백업의 로컬 복제본은 유지하고 싶지 않을 것입니다.

그럼, 파일 전송 완료될 때까지 기다렸다가 수동으로 이 로컬 백업을 삭제해야 할까요? 당연히 아닙니다. 이 자동 삭제는 '--remove-source-files' 옵션을 사용하여 할 수 있습니다.

[root@tecmint]# rsync --remove-source-files -zvh backup.tar /tmp/backups/

backup.tar

sent 14.71M bytes  received 31 bytes  4.20M bytes/sec

total size is 16.18M  speedup is 1.10

[root@tecmint]# ll backup.tar

ls: backup.tar: No such file or directory

9. rsync로 모의테스트 하기

당신이 초보자이고 rsync를 사용하고 있고 당신의 명령이 정확히 무엇을 하는지 모르는 경우 Rsync는 대상 폴더의 항목을 실제로 엉망으로 만들 수 있으며 실행 취소를 수행하는 것은 지루한 작업이 될 수 있습니다.

추천 읽기: Rsync 사용하여 두 웹 서버/웹 사이트를 동기화 하는 방법

이 옵션을 사용하면 아무 것도 변경되지 않고 명령의 테스트 실행만 수행하고 명령의 출력이 표시됩니다. 출력이 원하는 것과 정확히 일치하면 명령에서 '-dry-run' 옵션을 제거하고 명령의 출력을 표시할 수 있습니다. 터미널에서 실행합니다.

root@tecmint]# rsync --dry-run --remove-source-files -zvh backup.tar /tmp/backups/

backup.tar

sent 35 bytes  received 15 bytes  100.00 bytes/sec

total size is 16.18M  speedup is 323584.00 (DRY RUN)

10. 대역폭 제한을 설정하고 파일 전송하기

당신은 '–bwlimit' 옵션의 도움으로 한 머신에서 다른 머신으로 데이터를 전송하는 동안 대역폭을 설정할 수 있습니다. 이 옵션은 입출력(I/O) 대역폭을 제한하도록 우리에게 도움을 줍니다.

[root@tecmint]# rsync --bwlimit=100 -avzhe ssh  /var/lib/rpm/  root@192.168.0.100:/root/tmprpm/
root@192.168.0.100's password:
sending incremental file list
sent 324 bytes  received 12 bytes  61.09 bytes/sec
total size is 38.08M  speedup is 113347.05

또한 기본적으로 rsync는 변경된 블록과 바이트만 동기화합니다. 명시적으로 전체 파일을 동기화하려면 '-W' 옵션을 사용합니다.

[root@tecmint]# rsync -zvhW backup.tar /tmp/backups/backup.tar
backup.tar
sent 14.71M bytes  received 31 bytes  3.27M bytes/sec
total size is 16.18M  speedup is 1.10

이제 rsync에 알아 보았고 더 많은 옵션에 대한 매뉴얼 페이지에서 볼 수 있습니다. 앞으로 더 흥미롭고 흥미로운 튜토리얼을 위해 Tecmint와 계속 연결하십시오. 귀하의 의견과 제안을 남겨주세요.

반응형
반응형

출처

https://stackoverflow.com/questions/40852784/how-can-i-use-a-variable-in-curl-call-within-bash-script

bash 스크립트에서 curl 호출시 변수를 어떻게 사용할 수 있을까요?

간단한 작업이 있고 제 bash 스크립트 안에 curl 호출시 변수를 어떻게 사용할 수 있을지 알아내기 위해 이미 여러 시간을 소비하였습니다.

message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'

이는 문법적으로 작은 따옴표 안에 있기 때문에 ${message}을 출력합니다. 만약 따옴표를 바깥쪽은 큰 따옴표 안쪽은 작은 따옴표로 변경하였을 때 Hello와 there 명령어가 없다고(command not found: Hello 다음에 command not found: there) 나옵니다.

어떻게 해야 합니까?


2개 답변 중 1개만 추림

변수는 작음 따옴표 안에서 확장될 수 없습니다. 큰 따옴표로 다음처럼 다시 작성할 수 있습니다.

curl -X POST -H 'Content-type: application/json' --data "{\"text\": \"${message}\"}"

큰 따옴표 안에 큰 따옴표는 escape 문자(\)가 있어야 합니다.

다른 방법은 다음처럼 할 수 있습니다.

curl -X POST -H 'Content-type: application/json' --data '{"text": "'"${message}"'"}'

이것은 작은 따옴표에서 밖에서 단어 분할을 방지하기 위해 ${message} 를 큰 따옴표로 묶은 다음 다른 작은 따옴표 문자열로 끝납니다. 다음처럼 처리 됩니다.

... '{"text": "'"${message}"'"}'
    ^^^^^^^^^^^^
    작은 따옴표 문자열


... '{"text": "'"${message}"'"}'
                ^^^^^^^^^^^^
                큰 따옴표 문자열


... '{"text": "'"${message}"'"}'
                            ^^^^
                            작은 따옴표 문자열
반응형
반응형

출처

https://unix.stackexchange.com/questions/295274/grep-to-find-the-correct-line-sed-to-change-the-contents-then-putting-it-back

수정할 라인을 grep으로 찾고, 내용을 sed로 바꾼 뒤 원래 파일에 적용하는 방법?

저는 파일에서 특정 라인에 한 단어를 바꾸려고 합니다만 이 모두를 연결하는데 몇가지 문제가 있습니다.

기본적으로 제 파일의 한 라인은 키워드 'firmware_revision'이며 이 라인에서만 'test' 단어를 'production'으로 변경하고 싶습니다.

저는 이렇게 해 보았습니다.

grep 'firmware_revision' myfile.py | sed 's/test/production'

이 방법으로 제가 원하는 라인을 선택하여 대체를 실행할 수 있겠지만, 이전 줄을 대체하기 위해 새 줄을 원본 파일로 적용하는 방법은 알 수 없습니다. 분명히 파일로 다시 redirection할 수는 없습니다. 어떻게 해야 할까요?

임시 파일을 사용하더라도 grep을 사용하여 필요한 줄만 가져 오면 파일의 다른 모든 데이터가 손실되므로 더 이상 모든 데이터를 임시 파일로 리디렉션 한 다음 원본을 임시 파일로 바꿀 수 없습니다.

편집-누군가가 추가 정보를 요청했습니다.

다음과 같은 줄로 가득 찬 파일이 있다고 가정해 봅시다.

[
  ('key_name1', str, 'value1', 'Description'),
  ('key_name2', str, 'value2', 'Description'),
  ('key_name3', str, 'value3', 'Description'),
  ('firmware_revision', str, 'my-firmware-name-test', 'Firmware revision name')
]

이제 'firmware_revision'이 포함된 줄을 찾고 해당 줄에서 'test'라는 단어의 모든 인스턴스를 'production'으로 변경하는 스크립트 (이상적으로는 한 줄짜리)를 작성하고 싶습니다. '테스트'라는 단어는 해당 파일의 다른 위치에 있을 수 있으며 변경하지 않기를 바랍니다. 명확하게 하기 위해 위의 줄을 다음과 같이 변경하고 싶습니다.

('firmware_revision', str, 'my-firmware-name-production', 'Firmware revision name')

어떻게 해야 합니까?


2개 답변 중 1개

다음을 시도해 보세요.

sed -i.bak '/firmware_revision/ s/test/production/' myfile.py

여기 /firmware_revision/은 조건처럼 작동합니다. 정규식 firmware_revision과 매칭되는 라인이면 true(참) 이고 다른 라인에 대해서는 false(거짓)입니다. 조건이 true이면 다음 명령이 실행됩니다. 이 경우, 저 명령은 testproduction으로 처음 나왔을 때 대체하는 명령입니다.

다른 말로, 명령어 s/test/production/firmware_revision의 정규식과 매칭되는 라인에서만 실행됩니다. 모든 다른 라인은 변경되지 않고 지나갑니다.

기본적으로 sed는 표준출력으로 그것을 보냅니다. 하지만, 당신이 파일에 변경사항을 적용하고 싶다면, -i 옵션을 추가할 수 있습니다. 특별히, -i.bakbak 확장자로 지정된 백업 복사본으로 파일이 변경 되도록 합니다.

명령이 작동한다고 결정하고 위험하게 백업을 생성하지 않으려면 GNU sed (Linux)를 사용하여 다음을 사용하십시오.

sed -i '/firmware_revision/ s/test/production/' myfile.py

반면, BSD (OSX)에서는 -i 옵션은 argument를 가져야 합니다. 만약 백업을 남겨놓지 않길 바라면, 비어있는 argument를 제공해야 합니다. 다음처럼 사용하십시오.

편집

질문에 대한 편집에서 OP는 라인의 모든 test 발생이 production으로 대체 되도록 요청합니다. 이 경우 전역 (해당 행) 대체를 위해 대체 명령에 g 옵션을 추가합니다.

sed -i.bak '/firmware_revision/ s/test/production/g' myfile.py
반응형
반응형

출처 : https://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash

bash에서 어떻게 "cat << EOF"가 작동합니까?

저는 프로그램(psql)에 여러줄의 입력을 넣기(enter) 위해 스크립트를 작성할 필요가 있습니다.

구글링을 좀 한 결과 다음 문법이 작동함을 발견하였습니다.

cat << EOF | psql ---params
BEGIN;

`pg_dump ----something`

update table .... statement ...;

END;
EOF

이는 (BEGIN;부터 END;까지) 여러줄 문자열을 생성하고 psql의 입력으로 pipe 전달을 합니다.

하지만 저는 어떻게/왜 작동하는지 모르겠습니다. 아무나 설명해주실 수 있을까요?

저는 주로 cat << EOF를 참조하고 있습니다. 저는 >는 파일로 출력하기, >> 파일로 추가(append)하기, <는 파일로부터 읽기라는 것을 알고 있습니다.

<<는 정확히 무엇을 합니까?

그리고 이에 대한 man page가 있나요?


9 Answers

이는 표준입력으로 문자열을 제공하는 heredoc 포멧으로 불립니다. 더 자세한 내용은 https://en.wikipedia.org/wiki/Here_document#Unix_shells 를 보시면 됩니다.


man bash에서

Here Documents

이러한 유형의 redirection은 특정 단어만 포함된 행(뒤에 공백 없음)이 표시될 때까지 쉘이 현재 소스에서 입력을 읽도록 지시합니다.

그 지점까지 읽은 모든 행은 명령의 표준 입력으로 사용됩니다.

여기 문서의 형식은 다음과 같습니다.

          <<[-]word
                  here-document
         delimiter

매개 변수 확장, 명령 대체, 산술 확장 또는 경로 이름 확장은 단어(word)에서 수행되지 않습니다. 단어(word)의 문자가 인용된 경우 구분(delimeter) 기호는 단어에서 따옴표 부호를 제거한 결과이며 here-document의 행은 확장되지 않습니다. 단어(word)가 따옴표가 없을 경우 here-document의 모든 행은 매개 변수 확장, 명령 대체 및 산술 확장의 대상이 됩니다. 후자의 경우 문자 시퀀스 \ 은 무시되며 인용하는 데 \, $ 및 ` 문자를 사용해야 합니다.

redirection 연산자가 <<- 이면 모든 탭이 먼저오는 문자가 입력 줄과 구분(delimiter) 기호를 포함하는 줄에서 제거됩니다. 이를 통해 쉘 스크립트 내의 here-document를 자연스럽게 들여 쓰기 할 수 있습니다.

반응형
반응형

출처 : https://askubuntu.com/questions/810098/why-doesnt-my-alias-work-over-ssh

alias가 ssh에서 왜 작동하지 않을까요?

저는 .bashrc에서 다음과 같이 alias를 가지고 있습니다.

alias l.='ls -d .* --color=auto'

이는 매우 유용합니다 :) 하지만 ssh를 통해 작동하지 않습니다.

$ ssh localhost l.
bash: l.: command not found

왜 그럴까요?


1개의 답변

다음을 시도해 보세요.

ssh localhost -t bash -lci l.
  • alias는 당신의 로컬 컴퓨터가 아닌 원격 서버에서 ~/.bashrc에 있어야 됩니다.
  • -i 옵션은 bash에게 interactive 쉘이라고 알려줍니다. alias는 interactive 쉘에서만 가능합니다.
  • -t 옵션은 ssh에 슈도-터미널(pseudo-tty)을 할당하도록 합니다. 이것이 없으면 bash는 interactive 모드를 시작할 때 주의(warning) 메세지를 방출합니다. 이는 ls에 칼라를 가능하게 합니다. 이것이 없으면 당신은 --color=always를 사용해야 합니다. man ls를 확인해주세요.
  • 역자추가 : -l 옵션은 bash가 로그인 쉘로 호출된 것처럼 작동하게 합니다.
  • interactive flag를 설정하지 않고 alias를 가능하게 하는 다른 방법은 shopt -s expand_aliases를 사용하는 것입니다. 다음처럼 시도할 수 있습니다.
ssh localhost 'bash -c "shopt -s expand_aliases; l."'

하지만

  • .bashrc는 쉘 source이 interactive인 경우에만 alias를 정의할 수 있습니다. 이 예시에서 쉘은 interactive 형이 아닙니다.
  • 만약 같은 줄에 alias를 정의하려는 경우 이 항목을 참조하세요.
반응형
반응형

출처 : https://www.shellscript.sh/trap.html

Trap

Trap은 간단하지만 매우 유용한 유틸리티입니다. 스크립트로 현재 디렉터리에서 모든 파일의 내용을 FOO를 BAR로 바꾼 결과 파일을 만든다면, 스크립트가 종료할 때 /tmp를 정리할 수 있습니다. 하지만 도중에 중단되면 /tmp에 파일이 있을 수 있습니다.

#!/bin/sh

trap cleanup 1 2 3 6

cleanup()
{
  echo "Caught Signal ... cleaning up."
  rm -rf /tmp/temp_*.$$
  echo "Done cleanup ... quitting."
  exit 1
}

### main script
for i in *
do
  sed s/FOO/BAR/g $i > /tmp/temp_${i}.$$ && mv /tmp/temp_${i}.$$ $i
done

trap 구문은 시그널 1,2,3, 또는 6을 받았을 때 cleanup()을 실행하라고 스크립트에 말합니다. 가장 보편적인 시그널(CTRL-C)은 시그널 2(SIGINT)입니다. 이는 아주 흥미로운 목적으로도 사용될 수 있습니다.

#!/bin/sh

trap 'increment' 2

increment()
{
  echo "Caught SIGINT ..."
  X=`expr ${X} + 500`
  if [ "${X}" -gt "2000" ]
  then
    echo "Okay, I'll quit ..."
    exit 1
  fi
}

### main script
X=0
while :
do
  echo "X=$X"
  X=`expr ${X} + 1`
  sleep 1
done

위의 스크립트는 CTRL-C를 캐치하여 종료하지 않고 실행하면서 변수 값을 변경합니다. 이것이 유용성에 있어 어떤 긍정적이고 부정적인 효과를 미치는지는 독자의 연습으로 남겨 둡니다. 이 예시는 4번 인터럽트 (혹은 2000초) 이후에 종료합니다. 모든 쉘은 처리할 기회 없이 kill -9 <PID>에 의해 강제종료될 수 있습니다.

다음은 공통 인터럽트에 대한 표입니다.

번호 시그널 의미
0 0 쉘에서 종료했을 때
1 SIGHUP 깔끔한 정리
2 SIGINT 인터럽트
3 SIGQUIT 종료
6 SIGABRT 중단
9 SIGKILL 강제종료(trap 인식 안됨)
14 SIGALRM 알람 시계
15 SIGTERM 프로그램 종료

스크립트가 자체적으로 신호를 무시하는 환경 (예 : nohup 제어)에서 시작된 경우 스크립트는 해당 신호도 무시합니다.

반응형
반응형

출처 : https://superuser.com/questions/403800/how-can-i-make-the-bash-backtick-operator-keep-newlines-in-output

bash backtick() 연산자로 출력의 개행을 어떻게 유지할 수 있을까요?

backtick() 치환에 bash가 개행 문자를 먹지 않도록 하는 방법이 있습니까?

예를 들면

var=`echo line one && echo line two`
echo $var

line one line two

하지만 제가 원하는 것은 다음과 같습니다.

var=`echo line one && echo line two` # plus some magic
echo $var

line one
line two

3개의 답변 중 1개를 추려냄

이는 backtick() 치환 문제가 아닌 echo의 문제입니다. 제어 문자가 작동하려면 변수에 따옴표를 사용해야 합니다.

$ var=`echo line one && echo line two`
$ echo "$var"
line one
line two
반응형
반응형

출처 : https://stackoverflow.com/questions/3241086/how-to-schedule-to-run-first-sunday-of-every-month

매달 첫 번째 일요일에 crontab 스케쥴링 하는 방법

저는 Redhat에서 Bash를 사용하고 있습니다. 저는 매달 첫 번째 일요일 오전 9시에 cron job을 스케쥴링 하고 싶습니다. 이를 어떻게 할 수 있을까요?


10개의 답변 중 1개를 추려냄

crontab 파일에서 이를 다음처럼 할 수 있습니다.

00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script

date +%d 는 오늘의 날짜 중 몇일인지 제공하며, 몇일이 7보다 작거나 같은지 검사할 수 있습니다. 그렇다면 당신의 명령을 실행합니다.

만약 이 스크립트가 일요일에만 실행되기를 원하면, 그 달의 첫번째 일요일에만 실행된다는 뜻이 됩니다.

crontab 파일에서 date 명령의 포멧팅 옵션은 escape 처리가 되어야 합니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/13983365/grep-from-tar-gz-without-extracting-faster-one

압축해제 없이 tar.gz 파일을 grep 하기 [빠른 방법]

10여개의 .tar.gz 파일로부터 grep 패턴을 시도하였지만 매우 느립니다.
제가 사용한 내용입니다.

tar -ztf file.tar.gz | while read FILENAME
do
        if tar -zxf file.tar.gz "$FILENAME" -O | grep "string" > /dev/null
        then
                echo "$FILENAME contains string"
        fi
done

8개의 답변 중 1개를 추려냄

zgrep이 있다면 다음처럼 사용할 수 있습니다.

zgrep -a string file.tar.gz
반응형

+ Recent posts