2014-03-04 5 views
0

어떻게이 스크립트가 실제로 내가 속한 디렉토리를 변경할 수 있습니까? bash는 메뉴가있는 스크립트에서 디렉토리를 변경합니다.

그래서 스크립트는 다음 내가 원하는 것을 선택한 후, 그것이 내가 또한 소스하지만 여전히 아무것도 스크립트를 실행하려고 작동하지 않는 데이터베이스 에서 몇 가지 옵션을합니다 ..

#!/bin/bash 
    options=($(mysql --skip-column-names -uroot -pmypass all_dbs -e "select path from databases_table WHERE locked != 0 ")) 

    read_list(){ 
    echo "" 
    PS3="Change directory to:" 
    select opt in "${options[@]}" "Quit" ; do 
     if ((REPLY == 1 + ${#options[@]})) ; then 
      exit 
     elif ((REPLY > 0 && REPLY <= ${#options[@]})) ; then 
      chosen="$opt" 
      break 
     else 
      echo "Invalid option. Try another one." 
     fi 
    done 
    } 

    changeto_entry(){ 
    mysql -uroot -pmypass --skip-column-names all_dbs -e "select name,\`database\`,path from databases_table where locked != 0 AND name = '$chosen'" | while read name database path; do 
     cd $path 
    done 
    } 

    read_list 
    changeto_entry 

답변

1

cd은 파이프 라인으로 만든 서브 쉘에 있습니다.

true | cd/

가 대신 처리 대체에서 리디렉션을 사용하는 파이프 (cmd | while read; do ..; done)를 다시 작성할 수 있습니다 (while read; do ..; done < <(cmd)을)를 해결하려면 :

changeto_entry(){ 
    while read _ _ path 
    do 
    cd "$path" 
    done < <(mysql -uroot -pmypass --skip-column-names all_dbs -e "select name,\`database\`,path from databases_table where locked != 0 AND name = '$chosen'") 
} 

경우, 지금 여기에 같은 문제를 나타내는 간단한 테스트 케이스이다 mysql 명령이 정확하면 파일을 소싱하면 디렉토리가 변경됩니다.

+0

+1 이것은 거의 확실한 답변입니다. 나는 긴 선의 끝에 파이프 위에 유약이 풍부 해. 물론 스크립트는'source'd 일 필요가 있습니다. –

0

현재 작업 디렉토리는 스크립트가 아니라 사용자를위한 것입니다. 즉, 터미널 사용자는 실행 후 정상 상태로 돌아갑니다.

+0

내 디렉토리를 변경할 수있는 방법이 있습니까? –

+0

하나도 모르겠지만 실행 한 모든 스크립트에서 파일 시스템을 옮겨 다녔다면 저자가 뒤로 물러나는 것을 잊었 기 때문에 상상해보십시오. 꽤 짜증나. – Tim

0

당신이 정상적인 스크립트로 실행하는 대신 그것을 source 경우 스크립트가 작동하지 않을 수 있습니다 :

source ./mycdscript.sh 

이 당신의 bash는 프롬프트와 같은 쉘 내에서 스크립트의 명령을 평가하는 영향을 미칠 것입니다.

스크립트에서 설정/정의 된 모든 변수/기능이 프롬프트 쉘에서 계속 정의되므로주의해야합니다.

+0

그것은 소스와 함께 작동하지 않습니다 .. 우분투를 사용하고 있습니다 13 –

+0

'$ path' 변수가 설정되고 있습니까? 'while' 루프 내에서 값을 반향시킬 수 있습니까? –

+0

echo "cd $ path"를 사용했는데 설정이 바뀌 었습니다. –

관련 문제