2017-10-26 15 views
4

의 서브 쉘 동작 내가에서 자체 동일한 출력을 얻을하지 않는 이유 궁금 :배쉬 : LS

ls -1 -tF | head -n 1

echo $(ls -1 -tF | head -n 1)

내가 마지막으로 수정 된 파일을 얻기 위해 노력했다, 하지만 하위 셸 내부에서이 파일을 사용하면 결과적으로 하나 이상의 파일을 가져 오는 경우가 있습니까?

왜 그렇게 피하는가?

+0

내가 LS -tr | tail-n1이고 항상 작동합니다 .. – MostWanted

+1

는 서브 쉘을 인용합니다. 실행 파일의'file * '과 같아지며, 에코되기 전에 확장됩니다. '-F, --classify 항목들에 (*/=> @ |) 중 하나를 추가하십시오. – 123

+0

여기에 -F :'함수에 대한 설명 L { myvar = $ 1; h = $ {myvar : = "1"}; "마지막 $ {h} 개 수정 된 파일 :"; export L = $ (ls -1 -tF | fgrep -v/| head -n $ {h} | sed의/\ (\ * \ | = \ | @ \) $ // g '); ls -l $ L; } alias ol = 'L; xdg-open $ L ' ' –

답변

0

나는 방금 을 찾았습니다. echo $(ls -1 -tF | head -n 1) 을 사용하면 파일 그로 잉 메커니즘이 추가로 일치 할 수 있습니다.

그래서 echo "$(ls -1 -tF | head -n 1)"은 이것을 피합니다.

결과가 실행 파일이면 끝에 *가 있기 때문에.

내가 코멘트에 이유 -F을 배치했지만, 지금은 여기에 넣어하기로 결정 : 마지막으로 수정 얻을

내가 바로 가기를 가지고, 내 .bashrc에 다음 줄을 추가 파일이나 디렉토리가 나열 :

function L { 
    myvar=$1; h=${myvar:="1"}; 
    echo "last ${h} modified file(s):"; 
    export L=$(ls -1 -tF|fgrep -v/|head -n ${h}| sed 's/\(\*\|=\|@\)$//g');  
    ls -l $L; 
} 
function LD { 
    myvar=$1; 
    h=${myvar:="1"}; 
    echo "last ${h} modified directories:"; 
    export LD=$(ls -1 -tF|fgrep/|head -n $h | sed 's/\(\*\|=\|@\)$//g'); ls -ld $LD; 
} 
alias ol='L; xdg-open $L' 
alias cdl='LD; cd $LD' 

을 이제 내가 마지막 (최근 5) 수정 된 파일을 나열 L (또는 L 5)를 사용할 수 있습니다. 그러나 디렉토리가 아닙니다.

그리고 L; jmacs $ L 편집자를 열어 편집 할 수 있습니다. 전통적으로 나는 별칭 lt = 'ls -lrt'를 사용했으나 이름을 다시 입력해야합니다 ...

이제 mkdir ... cdl을 사용하여 해당 디렉토리로 변경합니다.

6

인용 부호가없는 서브 쉘을 사용하고 있는데 ls에 -F 플래그를 지정하면 파일 이름에 쉘 특수 문자가 출력되기 때문에 문제가 발생합니다.

-F, --classify
append indicator (one of */=>@|) to entries

실행 파일에 *가 추가됩니다.

당신이

echo $(ls -1 -tF | head -n 1) 

다음

$(ls -1 -tF | head -n 1) 

이 파일 이름을 반환하고, 그것을 실행하고 또한 다른 파일에 접두사로 발생하는 경우, 그것은 모두를 반환합니다 실행합니다.

예를 들어 당신이있는 경우

test.sh 
test.sh.backup 

는 다음이 반환됩니다 서브 쉘을 인용

test.sh test.sh.backup 

로 확장을 반향 때이 확장을 방지

test.sh* 

echo "$(ls -1 -tF | head -n 1)" 

반환

test.sh* 
+1

대단한 설명 .... 괄호 대신 중괄호를 사용하는 것이 더 좋습니다 :) {ls -1 -tF | 헤드 -n1; } 어떤 서브 쉘도 생성되지 않았다 – zee

+0

@zee 에코가 없으면 그냥 중괄호/부모없이 명령어를 실행할 수있다. – 123