`>>`이외의 파일 끝에 줄을 추가하는 또 다른 간단한 방법이 있습니까?


21

최근에 짧은 문장을 tree_hole파일에 에코하고 있습니다.

나는 echo 'something' >> tree_hole이 일 을 하기 위해 사용 하고 있었다 .

그러나 나는 이것을 자주하기 때문에 >대신 대신에 잘못 입력하면 어떻게 될지 걱정했습니다 >>.

그래서 나는 bashrc에서 내 자신의 전역 배쉬 기능을 만들었습니다.

function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; }
export -f th

그러나 파일 끝에 줄을 추가하는 또 다른 간단한 방법이 있는지 궁금합니다. 다른 경우에 자주 사용해야 할 수도 있기 때문입니다.

있어요?


9
>를 입력 할 때마다 해결 방법을 사용하고 있음을 잊지 않습니까? 일단 별명을 가지고 rm="rm -i"다른 환경 rm *에서 확인 질문을 기다리면서 썼습니다 . 당신은 위험한 습관을 배우고 있습니다!
Walter A

9
@WalterAer의 "해결 방법"을 사용하면 >> 대신>를 입력 할 수없고 "th some_sentence"만 실행됩니다.이 별칭은 정의되지 않은 경우 아무 것도 수행하지 않습니다.
Random832

1
@ Ranom832는 그의 해결 방법에 맞습니다. 경고는 noclobber와 같은 "솔루션"에 대한 것입니다. 일반 쉘에서 noclobber와 같은 것을 사용할 때 그는 임시 루트 일 때 무언가를 추가하고 싶을 때>를 사용할 수 있습니다.
Walter A

7
@ Random832 & WalterA 나는 보통 그것을 볼 때 이것에 대해 아무 말도하지 않지만 가끔 친근한 통지가 유용 할 수 있다고 생각했습니다. Zen의 사용자 프로필에는 자세한 내용이 없으므로 자신의 "해결 방법" 이 올바른 형식 인지 확실하지 않습니다 . 아마도 "해결 방법" 또는 OP의 "해결 방법" 이라고 말해야 합니다 . 아마도 당신은 Zen을 개인적으로 알고 있기 때문에 당신은 그의 것이 정확 하다는 것을 알고 있습니다. 그다지 큰 문제는 아닙니다. 당신이 저에 대해 이야기하기 위해 그 양식을 사용했다면 크게 감사하지 않았을 것입니다.
Celada

1
@ 젠, 당신은 >> 대신 오 입력이 걱정된다고 썼습니다. Celada의 계획은 환경의 위험을 없애고 좋은 해결책입니다. 이웃 (클로버가 없거나 ksh를 사용하는 사람)을 돕고 한두 문자 이상주의를 잃은 경우 실수로 그의 파일 중 하나를 덮어 쓸 수 있습니다. 그래서 당신이 당신의 환경에서 노 클로버 경고를받을 때마다, 신이나 셀라 다에게 감사하고, 스스로에게 말하십시오.
Walter A

답변:


47

noclobber옵션을 설정하십시오 .

bash-3.2$ set -o noclobber
bash-3.2$ echo hello >foo
bash-3.2$ echo hello >foo
bash: foo: cannot overwrite existing file
bash-3.2$ 

3
이것이 정답입니다. 파일을 강제로 사용하면 파일을 여전히 덮어 쓸 수 있습니다 >|. zsh기본적으로이 동작을 활성화합니다.
오리온

1
@orion zsh에서 어떻게 활성화 / 비활성화합니까? 명시 적으로 비활성화하는 것을 기억하지는 않지만 덮어 쓰기가 zsh에서 제대로 작동합니다.
muru

2
그것은이다 setopt noclobbersetopt clobber. 정확히 "기본"이 아닌 것 같습니다. 배포판과 함께 제공되는 구성 파일에 따라 다릅니다.
오리온

@muru는 set [+-]C현대 쉘 과 함께 작동해야합니다
mikeserv

3
@Zen set +o noclobber배쉬에서, 또는 set +C.
Ruslan

7

당신이 당신의 파일이 손상 될 걱정하는 경우 >사업자는 추가 할 파일 속성을 변경할 수 있습니다 단지 :
에서 EXT2 / EXT3 / ext4에 파일 시스템 : chattr +a file.txt
에서 XFS의 파일 시스템 :echo chattr +a | xfs_io file.txt

그리고 함수를 원한다면 이미 함수를 만들었습니다 (출력을 로깅하기 위해 서비스 파일에서 사용했습니다). 목적을 위해 변경할 수 있습니다.

# This function redirect logs to file or terminal or both!
#@ USAGE: log option data
# To the file     -f file
# To the terminal -t
function log(){
        read -r data       # Read data from pipe line

        [[ -z ${indata} ]] && return 1    # Return 1 if data is null

        # Log to /var/log/messages
        logger -i -t SOFTWARE ${data}

        # While loop for traveling on the arguments
        while [[ ! -z "$*" ]]; do
                case "$1" in
                        -t)
                                # Writting data to the terminal
                                printf "%s\n" "${data}"
                                ;;
                        -f) 
                                # Writting (appending) data to given log file address
                                fileadd=$2
                                printf "%s %s\n" "[$(date +"%D %T")] ${data}" >> ${fileadd}
                                ;;
                        *)
                                ;;
                esac
                shift           # Shifting arguments
        done
}

2
이 스크립트에는 몇 가지 문제가 있습니다. 1) 글 $로빙, 단어 분리 및 관련 공백 문제를 방지 하려면 일반적으로 매개 변수 확장 (로 시작하는 항목 )을 큰 따옴표로 묶어야합니다 . 온라인 ShellCheck 앱은 bash 스크립트에서이 문제와 다양한 문제를 포착 할 수 있습니다. 관련 메모 "$@"에서 보다 안전합니다 $*.
PM 2Ring

3
2) 일반적으로 입력의 백 슬래시가 다음 문자를 벗어나지 않도록 옵션 read과 함께 명령을 호출해야합니다 -r. 3) bash 스크립트에서는 ALL UPPER CASE가 시스템 변수에 사용되므로 스크립트 변수 이름에 소문자를 사용하는 것이 일반적입니다. 따라서 자신의 변수에 대문자를 사용하면 코드를 읽는 사람들을 혼란스럽게 할 수 있으며 나중에 스크립트에서 사용하려는 시스템 변수를 실수로 클로버 할 수 있습니다. 그리고 스크립트 를 소싱 하면 후속 명령에 대한 변수가 방해를받습니다.
PM 2Ring

3
4) echo고정 문자열을 인쇄하는 데 편리하지만 임의의 데이터, 특히 GNU 시스템에서 예기치 않은 작업을 수행 할 수 있습니다. 사용하는 것이 훨씬 안전합니다 printf. 자세한 정보, 특히 Stéphane Chazelas의 답변 은 unix.stackexchange.com/questions/65803/… 을 참조하십시오 .
PM 2Ring

3
@PM 2Ring, 오늘 나는 당신에게서 많은 것을 배웠습니다. 고마워요. 최대한 빨리 해결하겠습니다.
Sepahrad Salour 2012 년

1
잘 했어, 세파 라드!
PM 2Ring

3

teeappend 옵션과 함께 사용하십시오 .

foo | tee -a some-file
# or
tee -a some-file <<EOF
blah blah
EOF
# or 
tee -a some-file <<<"blah blah"

5
좋은 생각입니다, +1. OP가 >캐릭터를 잊어 버릴 염려가 있다면 -a옵션을 잊어 버릴까 걱정할 것입니다 !
Celada

@Celada 그렇게 가정합니다 (그러나 반복되는 키 입력 세트에서 하나의 키 입력이 누락되어 오타가 옵션을 잊어 버릴 가능성이 더 큽니다).
muru

0

덮어 쓰기 위해 파일을 열 수있는 많은 프로그램은 gnu dd와 같이 추가하기 위해 파일을 대신 열 수 있습니다.

dd conv=notrunc oflag=append of=file

바이트 수를 억제하기 위해 stdin 또는 if= 매개 변수 add 2>/dev/null에 이름이 지정된 파일을 읽을 수 있습니다.


3
답변으로 게시하기 전에 코드를 테스트하는 것이
좋습니다

1
추천 dd은 나쁜 생각입니다. dd신뢰성의 출력에 입력을 기록하지 않고 그 중 하나는 일반 파일 또는 차단 장치가 아닌 경우,하지
질 'SO-정지되는 악의'

@gilles, 카운트가 지정되지 않은 경우 dd는 cat과 마찬가지로 사용 가능한 모든 데이터를 복사합니다.
Jasen

-1

나는 sed(백업 복사로도-후 확장 참조 -i)을 사용하고 싶습니다 :

sed -i.bak '$ a\something' /Users/zen1/zen/pythonstudy/tree_hole

내가 놀라지 않는 이유는 ... 코스타스 :) (그것은 칭찬이다, BTW)
오후 2Ring

@ PM2Ring 예, 매우 위험합니다! : P
Costas

물론 작동하는 방식은 파일의 복사본을 만들고 끝에 새 텍스트를 추가 한 다음 원본 파일을 삭제하고 복사본의 이름을 원래 이름으로 바꾸는 것입니다. 디렉토리에 대한 쓰기 권한이 없으면 (1) 작동하지 않으며 (2) 링크가 끊어지며 (3) 파일이 크면 리소스가 비쌉니다. 당신 이 "위험한"이라는 단어 불러 온 것이 재밌 네요 !
G-Man, 'Reinstate

-1

당신은 항상 다른 방법으로 파일을 탐색 할 수 있습니다 ...

seq 10000000 >f
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
{ wc -l >&2; echo new line\!; } <>f >&0; \
wc -l f; tail f

... 이상하게 보이는 시퀀스 인쇄 :

10000000
10000001
10000002
10000003
10000004
10000005 f
9999996
9999997
9999998
9999999
10000000
new line!
new line!
new line!
new line!
new line!

그러나 그것은 다소 바보입니다.

더 유용한 예는 다음과 같습니다.

 apnd() if    shift
        then  wc -l  >&2
              printf "$@"
        fi    <>"$1" >&0

다음과 같이 호출 할 수 있습니다.

 apnd /path/to/file          \
      "${printf_fmt_string}" \
       arbitrary list of strings

그리고 추가 동작이 발생하기 직전에 file쓰여진 줄 수를 stderr세웁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.