bash가 $(<"filename")을 자동으로 대체하도록 만드는 방법

bash가 $(<"filename")을 자동으로 대체하도록 만드는 방법

고양이를 교체하고 싶습니다.

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

참고로:

에서는 zshkey라는 파일의 내용에 매핑되는 특수 연관 배열을 사용할 수 있습니다( $mapfile내장 함수와 아무 관련이 없으며(파일을 매핑하지 않음). 내장 함수보다 우선합니다(파일을 매핑하지 않음). ) 약 10년 정도 ). 일반 파일에만 so를 사용합니다.bashmapfilemmap()

zmodload zsh/mapfile
var=$mapfile[filename]

파일을 열거나 매핑할 수 없으면 아무것도 출력되지 않습니다. 오류를 확인하려면 $ERRNO특수 변수를 사용할 수 있습니다.

ERRNO=0
var=$mapfile[filename]
if ((ERRNO)); then
  : the mapping failed
fi

$ERRNO값은 모듈의 배열을 사용하여 ENOENT, ... 코드로 변환 EACCESS하거나 내장 함수를 사용하여 오류 문자열로 변환할 수 있습니다.$errnoszsh/systemsyserrorzsh/system

mapfile[filename]=$var파일의 내용을 변경할 수도 있습니다 . 이는 실제 매핑입니다.

while은 $(<filename)제거됩니다.모두filename,콘텐츠의 후행 줄 바꿈은 $mapfile[filename]파일의 전체 콘텐츠(바이너리 파일 포함)로 그대로 확장됩니다.

관련 정보