내가 수집하는 것에서 사용할 때 확인하고 싶습니다.
tee -- "$OUT_FILE"
( --
-로 시작하는 파일 이름에 대해서는 또는 작동하지 않습니다), tee
쓰기 위해 파일을 여는 데 성공합니다.
그게 그거야:
- 파일 경로의 길이가 PATH_MAX 제한을 초과하지 않습니다
- 파일이 존재하고 (symlink 확인 후) 디렉토리 유형이 아니며 쓰기 권한이 있습니다.
- 파일이 존재하지 않는 경우 파일의 dirname은 (symlink 확인 후) 디렉토리로 존재하며 파일에 대한 쓰기 및 검색 권한이 있으며 파일 이름 길이는 디렉토리가있는 파일 시스템의 NAME_MAX 제한을 초과하지 않습니다.
- 또는 파일이 존재하지 않고 심볼릭 링크 루프는 아니지만 바로 위의 기준을 충족하는 파일을 가리키는 심볼릭 링크
vfat, ntfs 또는 hfsplus와 같은 파일 시스템에는 파일 이름에 포함될 수있는 바이트 값, 디스크 할당량, 프로세스 제한, selinux, apparmor 또는 기타 보안 메커니즘, 전체 파일 시스템, inode가 남지 않은 장치, 장치 등이 제한되는 파일 시스템은 무시합니다. 어떤 이유로 프로세스가 열릴 수있는 실행 파일 인 다른 이유로 인해 열 수없는 파일은 파일을 열거 나 만드는 기능에도 영향을 줄 수 있습니다.
로 zsh
:
zmodload zsh/system
tee_would_likely_succeed() {
local file=$1 ERRNO=0 LC_ALL=C
if [ -d "$file" ]; then
return 1 # directory
elif [ -w "$file" ]; then
return 0 # writable non-directory
elif [ -e "$file" ]; then
return 1 # exists, non-writable
elif [ "$errnos[ERRNO]" != ENOENT ]; then
return 1 # only ENOENT error can be recovered
else
local dir=$file:P:h base=$file:t
[ -d "$dir" ] && # directory
[ -w "$dir" ] && # writable
[ -x "$dir" ] && # and searchable
(($#base <= $(getconf -- NAME_MAX "$dir")))
return
fi
}
에서 bash
또는 본쉘 같은 그냥 교체
zmodload zsh/system
tee_would_likely_succeed() {
<zsh-code>
}
와:
tee_would_likely_succeed() {
zsh -s -- "$@" << 'EOF'
zmodload zsh/system
<zsh-code>
EOF
}
zsh
여기 의 특정 기능은 $ERRNO
(마지막 시스템 호출의 오류 코드를 표시 함) $errnos[]
관련 배열을 해당 표준 C 매크로 이름으로 변환합니다. 그리고 $var:h
(csh에서) 및 $var:P
(zsh 5.3 이상 필요).
bash에는 아직 동등한 기능이 없습니다.
$file:h
dir=$(dirname -- "$file"; echo .); dir=${dir%??}
또는 GNU dirname
: 로 대체 할 수 있습니다 IFS= read -rd '' dir < <(dirname -z -- "$file")
.
의 경우 파일에서 $errnos[ERRNO] == ENOENT
접근 ls -Ld
하고 오류 메시지가 ENOENT 오류에 해당하는지 확인 하는 방법이 있습니다 . 그래도 믿을 수 있고 휴대하기가 까다 롭습니다.
한 가지 방법은 다음과 같습니다.
msg_for_ENOENT=$(LC_ALL=C ls -d -- '/no such file' 2>&1)
msg_for_ENOENT=${msg_for_ENOENT##*:}
(오류 메시지 가정 끝 로 syserror()
번역 ENOENT
하고 그 번역이 포함되지 않는 :
대신, 다음) 및 [ -e "$file" ]
수행 :
err=$(ls -Ld -- "$file" 2>&1)
와 함께 ENOENT 오류를 확인하십시오.
case $err in
(*:"$msg_for_ENOENT") ...
esac
이 $file:P
부분은 bash
특히 FreeBSD 에서 가장 까다로운 부분입니다 .
FreeBSD에는 옵션 을 허용 하는 realpath
명령과 readlink
명령이 -f
있지만 파일이 해석되지 않는 심볼릭 링크 인 경우에는 사용할 수 없습니다. 그와 같은의 perl
의 Cwd::realpath()
.
python
의 os.path.realpath()
유사에 작동하는 것처럼 않는 zsh
$file:P
정도의 적어도 하나 개의 버전 가정, python
설치하고는있다 python
, 당신이 할 수있는 (안 FreeBSD의에 주어진 인) 중 하나를 의미 명령 :
dir=$(python -c '
import os, sys
print(os.path.realpath(sys.argv[1]) + ".")' "$dir") || return
dir=${dir%.}
그러나에서의 모든 작업을 수행 할 수도 있습니다 python
.
또는 모든 코너 케이스를 처리하지 않기로 결정할 수 있습니다.