고양이를 교체하고 싶습니다.
var=$(cat "filename" 2>/dev/null)
bashism 구문을 통해:
var=$(<"filename")
문제는 그러한 경고를 피하기 위해 공격을 침묵시키는 방법을 모른다는 것입니다.
bash: filename: No such file or directory
나는 이것을 시도했습니다 :
var=$(2>/dev/null <"filename")
그러나 더 이상 기존 파일을 읽지 않습니다 var
.
답변1
할당을 복합 블록으로 래핑하고 리디렉션을 사용하는 것이 작동하는 것 같습니다.
{ var=$(<"$file"); } 2>/dev/null;
예를 들어
$ echo hello > test1; rm -f test2
$ file=test1; { var=$(<"$file"); } 2>/dev/null; echo "${var:-[it is empty]}"
hello
$ file=test2; { var=$(<"$file"); } 2>/dev/null; echo "${var:-"[it is empty]"}"
[it is empty]
서브쉘을 만드는 데 사용하지 마십시오 ( .. )
. 할당된 변수가 손실되기 때문입니다.
답변2
먼저 사용 가능하고 읽을 수 있는지 테스트하십시오.
if [ -f "filename" ] && [ -r "filename" ]; then
var=$(<"filename")
fi
이 -f
테스트는 다음 filename
을 참조하는지 테스트합니다.일반 파일그리고 -r
읽을 수 있는지 테스트해보세요.
답변3
또 다른 방법은 먼저 파일이 존재하는지 확인한 다음 이를 변수로 읽는 것입니다.
[ -e filename ] && var=$(<filename)
답변4
참고로:
에서는 zsh
key라는 파일의 내용에 매핑되는 특수 연관 배열을 사용할 수 있습니다( $mapfile
내장 함수와 아무 관련이 없으며(파일을 매핑하지 않음). 내장 함수보다 우선합니다(파일을 매핑하지 않음). ) 약 10년 정도 ). 일반 파일에만 so를 사용합니다.bash
mapfile
mmap()
zmodload zsh/mapfile
var=$mapfile[filename]
파일을 열거나 매핑할 수 없으면 아무것도 출력되지 않습니다. 오류를 확인하려면 $ERRNO
특수 변수를 사용할 수 있습니다.
ERRNO=0
var=$mapfile[filename]
if ((ERRNO)); then
: the mapping failed
fi
$ERRNO
값은 모듈의 배열을 사용하여 ENOENT
, ... 코드로 변환 EACCESS
하거나 내장 함수를 사용하여 오류 문자열로 변환할 수 있습니다.$errnos
zsh/system
syserror
zsh/system
mapfile[filename]=$var
파일의 내용을 변경할 수도 있습니다 . 이는 실제 매핑입니다.
while은 $(<filename)
제거됩니다.모두filename
,콘텐츠의 후행 줄 바꿈은 $mapfile[filename]
파일의 전체 콘텐츠(바이너리 파일 포함)로 그대로 확장됩니다.