쉘 없이 파일에 문자열 쓰기

쉘 없이 파일에 문자열 쓰기

실행 중인 쉘이 없는 환경이 있어서 리디렉션, 파이프, 여기 문서 또는 기타 쉘 주의를 사용할 수 없다고 가정해 보겠습니다.할 수 있는시작 명령(경유execvp또는 비슷한 방식). 명명된 파일에 임의의 문자열을 쓰고 싶습니다. 다음을 수행하는 표준 명령이 있습니까?

somecommand  outputfile 'string'

예를 들어:

somecommand /proc/sys/net/ipv4/ip_forward '1'

매우 어리석은 예는 다음과 같습니다.

curl -o /proc/sys/net/ipv4/ip_forward http://example.com/1.txt

그 안에 내가 원하는 문자열을 포함하도록 1.txt를 설정했습니다.

이를 위해 남용될 수 있는 일반적인 명령이 있습니까?

답변1

시스템에 비어 있지 않은 다른 파일이 있으면 다음을 사용하십시오.POSIXsed:

sed -e 's/.*/hello world/' -e 'wtarget' -e q otherfile

GNU sed와 비어 있지 않은 파일을 사용하면 다음을 사용할 수 있습니다.

sed -i.bak -e '$ihello world' -e 'd' foo

BSD의 경우 sed다음과 같이 작동합니다.

sed -i.bak -e '$i\
hello world' -e d foo

쉘을 사용하지 않는 경우 개행 문자는 문제가 되지 않을 수 있습니다.


그리고ex, 대상 파일이 존재하는 경우:

ex -c '0,$d' -c 's/^/hello world/' -c 'x' foo

이는 파일의 모든 내용을 삭제하고 첫 번째 줄을 "hello world"로 바꾼 다음 쓰고 종료합니다. vi대체를 사용하여 동일한 작업을 수행 할 수 있습니다 ex. 구현 시 여러 옵션을 지원할 필요는 없지만 -c일반적으로 지원됩니다. 많은 ex구현의 경우 파일이 이미 존재할 필요는 없습니다.


반품그리고awk:

awk -v FN=foo -v STR="hello world" 'BEGIN{printf(STR) > FN }'

"foo" 파일에 "hello world"를 씁니다.


기존 파일에 알려진 위치에 원하는 바이트가 포함되어 있는 경우 여러 명령을 통해 파일을 바이트 단위로 조합할 수 있습니다 dd(이 경우 alphabet알파벳이 포함되어 있지만 입력 파일이 혼합될 수 있음).

dd if=alphabet bs=1 skip=7 count=1 of=test
dd if=alphabet bs=1 skip=4 count=1 seek=1 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=2 of=test
dd if=alphabet bs=1 skip=11 count=1 seek=3 of=test
dd if=alphabet bs=1 skip=14 count=1 seek=4 of=test
cat test
hello

그러면 루틴이 제대로 cp작동하거나 이미 시작하기에 적합한 위치에 있을 수도 있습니다.


덜 일반적으로,mispipemoreutils의 명령셸리스 파이프라인 구축을 허용합니다.

mispipe "echo 1" "tee wtarget"

동일 echo 1 | tee wtarget하지만 종료 코드를 반환합니다 echo. 이는 다음을 사용합니다.system()이것내부적으로는 그렇지 않습니다엄격하게쉘이 존재해야 합니다.


마지막으로, 다른 범용 스크립트 언어 perl와 마찬가지로 명령줄에서 원하는 작업을 수행하는 임의의 프로그램을 작성할 수 있는 범용 명령이 있습니다 . python마찬가지로, 쉘이 "실행 중"이 아니지만 존재한다면 sh -c 'echo 1 > target'제대로 작동할 것입니다.

답변2

당신이 사용할 수있는 awk:

awk 'BEGIN {print "Hello" > "/tmp/file"}'

awk프로그램에 명령문이 하나만 포함되어 있으면 BEGIN입력을 처리하지 않고 해당 명령문만 해석합니다.

매개변수화할 수도 있습니다.

awk -v text="World" -v file="/tmp/main" 'BEGIN {print text > file}'

이 구문을 사용하더라도 백슬래시 문자를 이스케이프해야 합니다. 다음을 사용하는 데 문제가 없습니다 ARGV.

awk 'BEGIN {print ARGV[1] > ARGV[2]}' World /tmp/main

관련 정보