`>>`이외의 파일 끝에 줄을 추가하는 또 다른 간단한 방법이 있습니까? 될지 걱정했습니다 >>. 그래서 나는 bashrc에서

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

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

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

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

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

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

있어요?



답변

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$ 


답변

당신이 당신의 파일이 손상 될 걱정하는 경우 >사업자는 추가 할 파일 속성을 변경할 수 있습니다 단지 :
에서 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
}


답변

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

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


답변

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

dd conv=notrunc oflag=append of=file

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


답변

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

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


답변

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

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세웁니다.


답변