변수 (여기서는 var
) 의 내용을 파일 에 복사하고 싶습니다 .
파일 이름은 다른 변수에 저장됩니다 destfile
.
이 작업을 수행하는 데 문제가 있습니다. 내가 시도한 것은 다음과 같습니다.
cp $var $destfile
나는 또한 dd 명령으로 똑같은 것을 시도했다 ... 분명히 쉘 $var
은 디렉토리를 참조하고 있다고 생각 했고 그래서 디렉토리를 찾을 수 없다고 내게 말했다.
이 문제를 어떻게 해결합니까?
변수 (여기서는 var
) 의 내용을 파일 에 복사하고 싶습니다 .
파일 이름은 다른 변수에 저장됩니다 destfile
.
이 작업을 수행하는 데 문제가 있습니다. 내가 시도한 것은 다음과 같습니다.
cp $var $destfile
나는 또한 dd 명령으로 똑같은 것을 시도했다 ... 분명히 쉘 $var
은 디렉토리를 참조하고 있다고 생각 했고 그래서 디렉토리를 찾을 수 없다고 내게 말했다.
이 문제를 어떻게 해결합니까?
$var
파일 이름이나 파일에 기록해야하는 텍스트를 지정 합니까 ? 텍스트를 지정하는 경우이 콘텐츠를 작성하려는 파일의 이름은 무엇입니까?
$destdir
이름을 지정해야합니다 $destfile
그것이 오해의 소지가 아니에요 그래서 ... 이름은 $destdir
이 파일이 아닌 디렉토리를 지정 제안합니다. 이것은 전체 질문을 간단하고 이해하기 쉽게 만들 것입니다.
답변:
다음 echo
명령을 사용하십시오 .
var="text to append";
destdir=/some/directory/path/filename
if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi
if
테스트 $destdir
파일을 나타냅니다.
는 >
파일을 절단 한 후 텍스트를 추가합니다. $var
파일 기존 내용 에만 텍스트를 추가하려면 다음을 >>
대신 사용하십시오.
echo "$var" >> "$destdir"
이 cp
명령은 파일에 텍스트를 쓰는 것이 아니라 파일을 복사하는 데 사용됩니다.
]
in 사이에 공백이 필요합니다 "$destdir"]
.
echo
또한 변수에 후행 줄 바꿈을 추가합니다.
$var
입니다 -e text to append
, 그리고 does't 실제로 쓰기-e
echo $var
귀하의 변수를 확장하는 쉘에 의존, 그것은 작동하지 않습니다 매우 공백 및 특수 문자 같은 것들로 않습니다. perl -e 'print($ENV{var})'
대신 사용할 수 있으며 변수 값을 정확하게 출력합니다.
echo
var
과 같은 것을 포함 -e
하면 플래그로 해석 된다는 문제 가 있습니다. 또 다른 옵션은 printf
이지만 printf "$var" > "$destdir"
변수에서 이스케이프 된 문자를 확장하므로 변수에 백 슬래시가 포함되어 있으면 파일 내용이 일치하지 않습니다. 그러나 printf
백 슬래시 만 형식 문자열에서 이스케이프로 해석 하므로 %s
형식 지정자를 사용하여 정확한 변수 내용을 대상 파일에 저장할 수 있습니다 .
printf "%s" "$var" > "$destdir"
echo "$var" > destfile
잘못되었습니다.
printf
더 좋습니다.
변수가 다음과 같은 경우 위의 답변 중 어느 것도 작동하지 않습니다.
-e
-n
-E
\
다음을 포함합니다 .n
따라서 임의의 문자열 내용에 대해 신뢰할 수 없습니다.
bash에서는 "here strings"를 다음과 같이 사용할 수 있습니다.
cat <<< "$var" > "$destdir"
아래 의견에서 언급했듯이 @Trebawa의 답변 (내와 같은 방에서 공식화되었습니다!)을 사용 printf
하는 것이 더 나은 접근 방식입니다.
printf
이상은 cat
전자는 항상 외부 바이너리보다 빠르게 실행됩니다 쉘 내장 것입니다.
"변수 내용 복사"라고 말하면 해당 변수에 파일 이름이 포함되어 있습니까? 아니면 파일 이름이 포함되어 있습니까?
파일에 복사하려는 내용 이 $var
포함 된 질문으로 가정하고 있습니다 .
$ echo "$var" > "$destdir"
그러면 $ var의 값이 $ destdir이라는 파일에 반영됩니다. 따옴표에 유의하십시오. "$ var"를 따옴표로 묶는 것이 매우 중요합니다. 이름에 공백이있는 경우 "$ destdir"에도 해당됩니다. 추가하려면 :
$ echo "$var" >> "$destdir"
var
포함 된 경우 실패-e
echo
옵션 목록 을 종료 하기 위해 이중 하이픈을 첫 번째 인수로 전달하면 @Eric이 제기 한 문제가 해결됩니다.echo -- "$var" >> "$destfile"
위의 모든 작업이 수행되지만 처음에 발생할 필요가없는 문제 (이스케이프 및 특수 문자)를 해결해야합니다. 변수가 쉘에 의해 확장 될 때 특수 문자. 처음에는 (변수 확장)하지 마십시오. 확장없이 변수를 직접 사용하십시오.
또한 변수에 비밀이 포함되어 있고 해당 비밀을 파일에 복사하려는 경우 셸 명령의 추적 / 명령 에코가 비밀을 나타낼 수 있으므로 명령 줄에서 확장하지 않는 것이 좋습니다. 즉 $var
, 명령 줄에서 사용하는 모든 답변 은 셸의 추적 및 로깅에 변수 내용을 노출하여 잠재적 인 보안 위험을 가질 수 있습니다.
이것을 사용하십시오 :
printenv var >file
즉, OP 질문의 경우 :
printenv var >"$destfile"