Shell-파일에 변수 내용 쓰기


98

변수 (여기서는 var) 의 내용을 파일 에 복사하고 싶습니다 .

파일 이름은 다른 변수에 저장됩니다 destfile.

이 작업을 수행하는 데 문제가 있습니다. 내가 시도한 것은 다음과 같습니다.

cp $var $destfile

나는 또한 dd 명령으로 똑같은 것을 시도했다 ... 분명히 쉘 $var은 디렉토리를 참조하고 있다고 생각 했고 그래서 디렉토리를 찾을 수 없다고 내게 말했다.

이 문제를 어떻게 해결합니까?


2
변수를 채우는 방법을 보여주는 올바른 형식의 코드와 모든 관련 오류 메시지가 나타나는대로 정확하게 게시하여 질문을 개선하십시오 .
Todd A. Jacobs

2
"변수의 내용을 디렉토리에 복사"한다는 것은 무엇을 의미합니까? $var파일 이름이나 파일에 기록해야하는 텍스트를 지정 합니까 ? 텍스트를 지정하는 경우이 콘텐츠를 작성하려는 파일의 이름은 무엇입니까?
jahroy

$ var에는 복사하려는 텍스트가 포함되어 있으며 작성해야하는 파일은 사용자 정의이므로 처음에 변수를 사용하는 이유입니다.
user1546083

1
아마 $destdir이름을 지정해야합니다 $destfile그것이 오해의 소지가 아니에요 그래서 ... 이름은 $destdir이 파일이 아닌 디렉토리를 지정 제안합니다. 이것은 전체 질문을 간단하고 이해하기 쉽게 만들 것입니다.
jahroy

답변:


149

다음 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명령은 파일에 텍스트를 쓰는 것이 아니라 파일을 복사하는 데 사용됩니다.


4
더 따옴표를 요구 - 지금, 변수의 값에서 공백의 실행이 하나의 공간으로 변환됩니다, 글로브 표현 등, 확장됩니다
찰스 더피

2
다른 한 가지-닫는 따옴표와 ]in 사이에 공백이 필요합니다 "$destdir"].
Charles Duffy

3
echo또한 변수에 후행 줄 바꿈을 추가합니다.
Ben Dilts 2015-06-11

6
경우에 실패 $var입니다 -e text to append, 그리고 does't 실제로 쓰기-e
에릭

1
때문에 echo $var귀하의 변수를 확장하는 쉘에 의존, 그것은 작동하지 않습니다 매우 공백 및 특수 문자 같은 것들로 않습니다. perl -e 'print($ENV{var})'대신 사용할 수 있으며 변수 값을 정확하게 출력합니다.
Blake Mitchell

41

echovar과 같은 것을 포함 -e하면 플래그로 해석 된다는 문제 가 있습니다. 또 다른 옵션은 printf이지만 printf "$var" > "$destdir"변수에서 이스케이프 된 문자를 확장하므로 변수에 백 슬래시가 포함되어 있으면 파일 내용이 일치하지 않습니다. 그러나 printf백 슬래시 만 형식 문자열에서 이스케이프로 해석 하므로 %s형식 지정자를 사용하여 정확한 변수 내용을 대상 파일에 저장할 수 있습니다 .

printf "%s" "$var" > "$destdir"


1
printf는 삼중 따옴표 또는 heredoc과 같이 변수 문자열에 개행 문자가있는 경우에도 좋습니다. echo는 개행 문자를 잘 처리하지 않습니다.
beeflobill

@beeflobill은 "echo가 줄 바꿈을 잘 처리하지 못함"을 설명 할 수 있습니다. 내가 본 유일한 것은 echo가 개행을 추가한다는 것입니다. 어느 것이 echo "$var" > destfile잘못되었습니다.
SensorSmith

@SensorSmith 내 실험에서 문자열에 "\ n"이 있으면 에코가 개행 문자를 인쇄한다는 것을 알 수 있습니다. 그러나 문자열에 실제 개행 문자가 있으면 echo는 인쇄하지 않습니다. 이유를 모르겠습니다.
beeflobill

1
기본적으로 이식성 (및 안정성) 문제입니다. unix.stackexchange.com/a/65819… 또는 우리 중 치명적인 사람들을 위해 : printf더 좋습니다.
user3342816

30

변수가 다음과 같은 경우 위의 답변 중 어느 것도 작동하지 않습니다.

  • 로 시작 -e
  • 로 시작 -n
  • 로 시작 -E
  • \다음을 포함합니다 .n
  • 그 뒤에 추가 줄 바꿈이 없어야합니다.

따라서 임의의 문자열 내용에 대해 신뢰할 수 없습니다.

bash에서는 "here strings"를 다음과 같이 사용할 수 있습니다.

cat <<< "$var" > "$destdir"

아래 의견에서 언급했듯이 @Trebawa의 답변 (내와 같은 방에서 공식화되었습니다!)을 사용 printf하는 것이 더 나은 접근 방식입니다.


5
내가 알 수있는 바에 따르면, cat은 변수 끝에 줄 바꿈이 없는지에 관계없이 항상 파일 끝에 줄 바꿈을 삽입합니다 (대부분의 경우 이것이 좋은 일 임에도 불구하고). printf를 사용 하는 대답 은 후행 개행을 삽입하지 않는 것 같습니다.
Ash

@Ash의 또 다른 장점 printf이상은 cat전자는 항상 외부 바이너리보다 빠르게 실행됩니다 쉘 내장 것입니다.
Géza Török

7

내가 당신을 옳게 이해했다면, 당신 $var은 파일 로 복사하고 싶습니다 (문자열 인 경우).

echo $var > $destdir

이것이 완료되는 방법입니다. 은 Using cp명령은 쉘이 파일이나 디렉토리의 이름으로 첫 번째 인수를 해석 할 것입니다.
jahroy

5
당신이 묶지 경우 $var따옴표로, 파일의 내용이 100 %가 어떤 경우는 $ VAR의 내용과 동일하다. 예를 들어 RSA 키를 포함하는 변수를 "반향"할 때 파일에 잘못된 키가 표시됩니다.
srigi

6
$var공백 이 포함 된 경우 실패 또는-e
Eric

1

"변수 내용 복사"라고 말하면 해당 변수에 파일 이름이 포함되어 있습니까? 아니면 파일 이름이 포함되어 있습니까?

파일에 복사하려는 내용$var포함 된 질문으로 가정하고 있습니다 .

$ echo "$var" > "$destdir"

그러면 $ var의 값이 $ destdir이라는 파일에 반영됩니다. 따옴표에 유의하십시오. "$ var"를 따옴표로 묶는 것이 매우 중요합니다. 이름에 공백이있는 경우 "$ destdir"에도 해당됩니다. 추가하려면 :

$ echo "$var" >> "$destdir"

3
var포함 된 경우 실패-e
Eric

1
echo 옵션 목록 을 종료 하기 위해 이중 하이픈을 첫 번째 인수로 전달하면 @Eric이 제기 한 문제가 해결됩니다.echo -- "$var" >> "$destfile"
Géza Török

1

위의 모든 작업이 수행되지만 처음에 발생할 필요가없는 문제 (이스케이프 및 특수 문자)를 해결해야합니다. 변수가 쉘에 의해 확장 될 때 특수 문자. 처음에는 (변수 확장)하지 마십시오. 확장없이 변수를 직접 사용하십시오.

또한 변수에 비밀이 포함되어 있고 해당 비밀을 파일에 복사하려는 경우 셸 명령의 추적 / 명령 에코가 비밀을 나타낼 수 있으므로 명령 줄에서 확장하지 않는 것이 좋습니다. 즉 $var, 명령 줄에서 사용하는 모든 답변 은 셸의 추적 및 로깅에 변수 내용을 노출하여 잠재적 인 보안 위험을 가질 수 있습니다.

이것을 사용하십시오 :

printenv var >file

즉, OP 질문의 경우 :

printenv var >"$destfile"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.