2014-03-04 50 views
0

我怎樣才能讓這個腳本實際上改變我所在的目錄?從腳本菜單中改變目錄

因此腳本只是需要一些選項從數據庫 然後後,我選擇了一個我想,這是行不通的 我也嘗試運行與源,但仍然沒有腳本..

#!/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

您正在嘗試在管道創建的子shell中使用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提示符中評估腳本命令的效果。

但要小心,因爲在腳本中設置/定義的任何變量/函數仍將在您的提示shell中定義。

+0

它不工作與源..我使用的是Ubuntu 13 –

+0

你確定'$ path'變量設置?你可以在'while'循環中回顯它的值嗎? –

+0

我用回聲「CD $路徑」,我看到它正在設置 –