staticEntries.dic과 DynamicEntries.dic라는 두 파일을 연결하고 싶습니다. 이름에서 알 수 있듯이 staticEntries.dic의 내용은 시간이 지나도 동일하게 유지되지만(일반적인 단어 포함), 반대로 DynamicEntries.dic은 시간이 지나면 변경될 수 있습니다(데이터베이스에서 추출된 약어 포함). 내 편집기에서 이 두 파일의 내용이 포함된 mydict.dic을 제공하고 싶습니다. 물론 셸을 통해 이 작업을 수행할 수 있지만 그런 다음 생성된 mydict.dic에 새 버전의 DynamicEntries.dic를 연결하려면 먼저 mydict.dic 파일의 DynamicEntries.dic 콘텐츠를 바꿔야 합니다. -> 다른 두 파일을 연결하는 명령으로 mydict.dic 파일을 생성하고 싶은데 어떻게 해야 할지 모르겠습니다. 내 편집자가 실행하거나 호출하지 않았기 때문에(아마도) bash 명령을 사용할 수 없습니다.
다음은 간단한 예입니다.
staticEntries.dic의 내용
house
dog
horse
DynamicEntries.dic의 내용. 이 콘텐츠는 데이터베이스에서 생성되므로 시간이 지남에 따라 변경될 수 있습니다.
EGB38
PD
UH7ZT
mydict.dic의 추적 콘텐츠
house
dog
horse
EGB38
PD
UH7ZT
쉘을 통해 해당 조합을 수행하는 경우, 새 버전의 동적Entries.dic 파일이 생성되면 문제가 발생합니다. mydict.dic 파일에서 중복된 항목을 어떻게 방지할 수 있습니까? 그래서 연결된 명령을 파일에 넣고 이를 사전 파일로 편집기에 제공할 수 있는 일반 파일로 참조하고 싶습니다. 이것이 가능한지 아니면 다른 접근 방식을 취해야 하는지 모르겠습니다.
답변1
명명된 파이프 뒤에 있는 스크립트를 작성하고 열고 읽을 때 staticEntries.dic 및 DynamicEntries.dic의 내용을 덤프할 수 있습니다. 파이프는 닫히고 다시 열릴 때까지 출력을 종료합니다.
하지만 스크립트를 백그라운드에서 실행 중인 상태로 두어야 하며 로그아웃/로그인 또는 재부팅 후에 다시 시작해야 합니다.
더 중요한 것은 이것이 쉘 프로그래밍 초보자를 위한 작업이 아니라는 것입니다.
때로는 (보통) 가장 간단한 솔루션이 가장 좋습니다.
더 간단한 접근 방식은 mydict.dic을 다른 두 파일에 종속적으로 정의하는 Makefile을 만들고 필요할 때 make를 실행하여 업데이트하는 것입니다. 또는 그냥 쉘 스크립트 - Makefile의 장점은 cron에서 실행할 수도 있고 소스 파일 중 하나가 변경되면 대상 파일(mydict.dic)만 업데이트한다는 것입니다.
예를 들어:
#!/usr/bin/make -f
all: mydict.dic
mydict.dic: staticEntries.dic dynamicEntries.dic
cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
mv mydict.dic.tmp mydict.dic
줄은 공백이 아닌 탭으로 cat
시작됩니다 .mv
연결된 파일은 먼저 임시 파일로 생성된 다음 제자리로 이동되므로 이전 파일을 새 파일로 바꾸는 것은 원자성 작업입니다. 아이디어는 파일을 사용할 때마다 완전한 이전 버전이나 완전한 새 버전을 갖게 되지만 새 버전의 부분 버전은 결코 가지지 않는다는 것입니다.
소스 .dic 파일이 다른 디렉토리에 있는 경우 파일의 전체 경로 이름을 지정해야 합니다.
답변2
동적 사전이 수정된 경우 작은 cronjob을 실행하여 파일을 다시 연결합니다. 먼저 파일의 변경 사항을 감시하는 작은 스크립트를 작성합니다.
#!/usr/bin/env bash
while true; do
inotifywait -e modify path/to/dynamicEntries.dic
sort path/to/dynamicEntries.dic /path/to/staticEntries.dic |
uniq > mydict.dic.tmp
sleep 1
done
이제 스크립트를 dict.sh
실행 가능하게 만드는 다른 이름 으로 저장 (chmod a+x dict.sh
하고 재부팅 시 스크립트를 시작하는 crontab을 만듭니다. 다음 줄을 실행 crontab -e
하고 붙여넣으세요.
@reboot /path/to/dict.sh
이제 동적 사전이 변경될 때마다 수동으로 실행할 필요 없이 사전이 자동으로 업데이트됩니다.
답변3
셸에서 파일을 연결하는 것은 간단합니다.
cat staticEntries.dic dynamicEntries.dic
그러면 두 파일의 내용이 모두 인쇄됩니다 stdout
. 결과를 새 파일로 리디렉션하려면 다음을 수행하십시오.
cat staticEntries.dic dynamicEntries.dic > mydict.dic
하지만 어쩌면 그것은 당신이 찾고 있는 것이 아닐 수도 있습니다...? 나는 당신이 해결하려는 문제를 잘 이해하지 못한다고 말하고 싶습니다.
답변4
편집자에게 말하는 방법을 변경할 수 있습니다. 를 사용한다고 가정하면 vi
쉘 스크립트를 작성할 수 있습니다 editmydictionary.sh
.
cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
vi mydict.dic.tmp
따라서 를 실행할 때마다 editmydictionary.sh
두 파일의 최신 버전을 편집하게 됩니다.