2014-10-02 12 views
5

문제

로서 작용한다. 속성`LN -s`는 I이 배시 스크립트가`cp`

db.active = B 

스크립트를 실행하면 하드 공동 py (= cp)가 수행되고 config.properties은 기호 링크 (해당 문제의 물리적 링크가 아님)가 아니라 config-a.properties 또는 config-b.properties과 같은 내용의 완전히 새로운 파일입니다. 내가 수동 라인 라인으로 프롬프트에서이 프로그램을 실행할 때

$ ls -li 
53 -rw-r--r-- 1 ogregoir ogregoir  582 Sep 30 15:41 config-a.properties 
54 -rw-r--r-- 1 ogregoir ogregoir  582 Sep 30 15:41 config-b.properties 
56 -rw-r--r-- 1 ogregoir ogregoir  582 Oct 2 11:28 config.properties 

, 나는 아무 문제가 없으며 심볼릭 링크는 실제로 항상 생성 config-a.properties 또는 config-b.properties 대한 config.properties 점이다.

$ ls -li 
53 -rw-r--r-- 1 ogregoir ogregoir  582 Sep 30 15:41 config-a.properties 
54 -rw-r--r-- 1 ogregoir ogregoir  582 Sep 30 15:41 config-b.properties 
55 lrwxrwxrwx 1 ogregoir ogregoir  20 Oct 2 11:41 config.properties -> config-b.properties 

노트

  • 어떤 파일이 다른 곳 열려 있지는 (필자는 활성 사용자와 구성이 실행되고 있지 사용하여 응용 프로그램이야).
  • 간혹 가끔 ln -sf이 정상적으로 작동하지만 일반적인 규칙은 하드 카피를 만드는 것입니다.
  • 스크립트는 여기에서 작업을 수행하기 전에 config*.properties 파일이있는 디렉토리의 cd을 다른 디렉토리에서 실행합니다.
  • 스크립트는 훨씬 길지만 오류를 재생하는 가장 짧은 예제입니다.
  • bash 버전은 4.1.2입니다 (로컬이므로 쉘 셸을 신경 쓰지 않아도됩니다).
  • ln 버전은 8.4입니다.
  • 운영 체제 : Red Hat Enterprise Linux 서버 릴리스 6.5 (산티아고).
  • 해당 폴더에 사용 된 파일 시스템 : ext4.

질문

  • 왜 내 스크립트가 지속적으로 심볼릭 링크를 생성하지 않고 하드 카피를 무엇입니까?
  • 여기에 심볼릭 링크를 강제 설정하는 방법은 무엇입니까?
+6

'ln' 명령은 복사본을 만들지 않습니다 *. Never – hek2mgl

+1

예,'man ln'을 읽을 수는 있지만 아직 무작위로! –

+0

어떤 OS와 파일 시스템입니까? – Cyrus

답변

3

심볼릭 링크를 덮어 쓰는 다른 스크립트 또는 코드가있는 것 같습니다. 예를 들어 sed -i은 심볼릭 링크를 휴지통에 버립니다. 사본을 작성하고 사본을 수정 한 다음 복사본을 원래의 심볼릭 링크 위로 옮겨 파일을 수정하는 다양한 명령과 유틸리티가 있으며 원래의 심볼릭 링크를 파괴합니다.

+0

이것은 사실입니다. 나는'sed -i'의 유무를 확인한 결과가 다릅니다. 고마워요! 필자는 파일을 대체 할 것이라고 생각하지 않았으므로 작은 테스트에서이 파일을 남겨 뒀지 만 질문에 복사하거나 붙여 넣지 않았습니다. 죄송합니다. –

+0

이제'sed --follow-symlinks -i'를 사용하고 제 스크립트가 원하는 것을 정확히하고 있습니다. 감사! –

+0

This :'sed -i "$ (realpath ./config.properties)"'는 파일을 (완전히) 해석함으로써 작동합니다. 'https : // stackoverflow.com/questions/7665/how-to-resolve-symbolic-links-in-a-shell-script' –

1

질문에 대한 가능한 답변 : ln이 (가) cp으로 표시되는 이유는 다음과 같습니다.

유일하게 가능한 다른 대답은 : 당신이 우리에게 선물하는 것이 정확히 무엇이 실행되고 있지 않은지 아니면 대답을 바꾸는 다른 스크립트가 실행 중인지입니다.

일부 가능한 대안 :
1- ln 명령은 실제로 하드 링크를 수행하고 있습니다.i- 노드 목록 (ls -li)은 i- 노드 번호가 고유 함을 확인합니다. 그래서, 그 이유가 아닙니다.

2. ln에 대한 별칭 또는 기능이 있습니까?
확인하기 쉽습니다. Bash에서 type -a ln을 발행하십시오. 결과는 bash가 ln을 해석하는 것을 보여줍니다. 파일이 /bin/ln 인 경우 올바른 것입니다.
별칭 또는 관련된 기능이 없음을 확인했습니다.

3 - "스크립트는 다른 디렉토리에서 실행됩니다". 여기에 요점은 : i- 노드 번호가 동일한 파일 시스템의 다른 위치에 파일이 있습니까 (ln이 실제로 하드 링크를 작성하는 경우). 같은 아이 노드와 다른 파일의 존재는 (당신의 명부에서 inode 번호 53,54,56 사용)가 확인 될 수있다 :

find/-follow -inum <your inum> 

4 .- 난 당신이 config-b.properties을 진정으로 알고 있습니다 희망 파일로 실제로 존재하지 않습니다. 이러한 파일을 편집하면 링크가 삭제 될 수 있습니다.

파일 내용을 변경/업데이트하는 실제 스크립트가 실행 되었습니까?

Note01 : 참고 K 트릭은 단지 하나의 외부 호출에서 추출을 해결한다는 것을 : http://www.charlestonsw.com/perl-regular-expression-k-trick/

ACTIVE_DB=$(grep -Po "^[ \t]*db.active[ ]+=[ ]+\K." config.properties) 

IT는 sed -iconfig-b.properties에 나중에 실제 실행되는 스크립트의 소스 인 것으로 확인되었다 문제.

+0

따옴표에 관해서는, 나는 커트의 결과가 "A"다는 것을 알고있다. 그것이 내가 나중에 그것을 다듬는 이유입니다. 나머지는 내가 돌아 왔을 때 확인해 보겠습니다. 통찰력을 가져 주셔서 감사합니다. –

+0

'type -a ln'의 결과는'ln is/bin/ln'입니다. 나를 위해 괜찮아 보인다. 내 질문에 보여준 스 니펫은 그대로 스크립트 및 구성 파일에서 가져온 것입니다. 우리는 실제로 A와 B라고 부르고 서로를 대체 할 수있는 데이터베이스를 가지고 있습니다. 마지막으로 두 번째 요점을 이해하지 못합니다. 당신은 정교 할 수 있습니까? –

+0

'ln'명령으로 신고 할 수 없습니다. 뭔가 다른 일이 일어나야합니다. 더 많은 옵션을 제공하기 위해 답을 수정하겠습니다. –