2015-06-28 21 views
6

Chcę przetestować wyjście skryptu bash, gdy brakuje jednego z plików wykonywalnych, od którego zależy, więc chcę uruchomić ten skrypt z zależnością "ukryty", ale nie dla innych. PATH= ./script nie jest opcją, ponieważ skrypt musi uruchomić inne pliki wykonywalne, zanim dotrze do instrukcji, którą chcę przetestować. Czy istnieje sposób "ukrywania" pliku wykonywalnego ze skryptu bez zmiany systemu plików?Jak ukryć plik wykonywalny ze skryptu bash?

Dla konkretnego przykładu chcę uruchomić this script, ale ukryć przed nim plik wykonywalny git (który jest jego główną zależnością), aby móc przetestować jego wydajność w tych warunkach.

+1

Utwórz wirtualną maszynę, która nie zawiera w sobie git. – bmargulies

Odpowiedz

6

można użyć wbudowanego polecenia, hash:

hash [-r] [-p filename] [-dt] [name]

Za każdym razem, gdy wywoływany jest skrót, zapamiętuje pełne nazwy ścieżek poleceń określonych jako argumenty nazw, więc nie muszą być wyszukiwane podczas kolejnych wywołań. ... Opcja -p wstrzymuje wyszukiwanie ścieżki, a nazwa pliku jest używana jako lokalizacja nazwy. ... Opcja -d powoduje, że powłoka zapomina zapamiętaną lokalizację każdej nazwy.

Przekazując nieistniejącego pliku z opcją -p, to będzie jak gdyby komenda nie można znaleźć (choć to może jeszcze być dostępne z pełną ścieżką). Przekazanie -d cofa efekt.

$ hash -p /dev/null/git git 
$ git --version 
bash: /dev/null/git: command not found 
$ /usr/bin/git --version 
git version 1.9.5 
$ hash -d git 
$ git --version 
git version 1.9.5 
1

Ponieważ wiemy, że program działa w bashu, jednym z rozwiązań jest - zamiast "ukrywania" programu - emulować zachowanie basha w takich okolicznościach. Możemy dowiedzieć się, co robi bash gdy polecenie nie zostanie znaleziony dość łatwo:

$ bash 
$ not-a-command > stdout 2> stderr 
$ echo $? 
127 
$ cat stdout 
$ cat stderr 
bash: not-a-command: command not found 

możemy następnie napisać to zachowanie do skryptu z nazwą pliku wykonywalnego, takich jak git na przykład na pytanie to:

$ echo 'echo >&2 "bash: git: command not found" && exit 127' > git 
$ chmod +x git 
$ PATH="$PWD:$PATH" git 
$ echo $? 
127 
$ cat stdout 
$ cat stderr 
bash: git: command not found 
4

Dodaj funkcję o nazwie git

git() { false; } 

To będzie "ukryć" komenda git

Aby skopiować @ idei npostavs męska, nadal można dostać się do "prawdziwego" git z command wbudowane:

command git --version 
Powiązane problemy