2017-04-12 193 views
1

我想運行shell腳本,其中exe1改爲查找爲/path/to/exe1而不是引用我在/path/to/exe2中看到的exe2。理想情況下,我想以最緊湊的方式做到這一點,副作用最小。在bash中重命名單個腳本的可執行文件

爲了使這個例子具體,有點類似於我真正關心的問題,我有一個shell腳本script.sh其中

$ cat script.sh 
#!/usr/bin/env bash 
python --version 

我對我目前的PATH兩個可執行文件:

$ python --version 
Python 2.7.x 
$ python3 --version 
Python 3.5.x 

我想以這樣的方式撥打script.sh

$ <magic> ./script.sh 
Python 3.5.x 
$ python --version 
Python 2.7.x 

我能找到到目前爲止,最好的辦法是

$ mkdir /tmp/python3 && ln -s $(which python3) /tmp/python3/python && env PATH="/tmp/python3:$PATH" ./script.sh 

這可以通過使用mktemp -d和清理做出更好一點,但它仍然需要編寫大多是不必要的文件,東西好像我應該只是能夠告訴bash,將python視爲python3。像別名一樣是理想的,但它們不會被傳遞到子殼體上。有沒有一個明顯的工具我錯過了,或者我堅持使用這種方法的變種?

+0

所以你想運行這個腳本,並且根據你在腳本之外做的事情,能夠讓它訪問那個時候你想要的任何版本的python?也就是說,「今天我需要Python 3,所以doas3 ./script.sh」?使用參數運行腳本並確定要運行的內容是否可以接受?也就是「./script.sh -p 3」,然後腳本就會說「if -p 3,use python3,else python2」? –

回答

1

我想打電話給script.sh以這樣的方式

$ <magic> ./script.sh 
Python 3.5.x 
$ python --version 
Python 2.7.x 

您可以使用函數做這樣的:

(python() { python3 "[email protected]"; }; declare -xf python; ./script.sh) 
  • 我們在只調用01的子shell中創建名爲python的函數可執行文件。
  • 在子外殼中執行此操作,以便當前環境不會混亂。