簡體   English   中英

如何從bash腳本中“隱藏”可執行文件?

[英]How to “hide” an executable from a bash script?

我想測試bash腳本的輸出,當它依賴的其中一個可執行文件丟失時,所以我想運行該腳本的依賴項“隱藏”而不是其他。 PATH= ./script不是一個選項,因為腳本在到達我想要測試的語句之前需要運行其他可執行文件。 有沒有一種方法可以在不改變文件系統的情況下從腳本中“隱藏”可執行文件?

舉一個具體的例子,我想運行這個腳本但是從它隱藏git可執行文件(這是它的主要依賴項),以便我可以在這些條件下測試它的輸出。

你可以使用builtin命令, hash

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

每次調用哈希時,它都會記住指定為名稱參數的命令的完整路徑名,因此無需在后續調用中搜索它們。 ... -p選項禁止路徑搜索,filename用作名稱的位置。 ... -d選項導致shell忘記每個名稱的記憶位置。

通過將不存在的文件傳遞給-p選項,就好像無法找到命令一樣(盡管仍然可以通過完整路徑訪問它)。 傳遞-d撤消效果。

$ 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

添加一個名為git的函數

git() { false; }

這將“隱藏”git命令

要復制@ npostavs的想法,你仍然可以使用內置command獲得“真正的”git:

command git --version

由於我們知道程序在bash中運行,因此一種解決方案是 - 而不是“隱藏”程序 - 在這種情況下模擬bash的行為。 我們可以很容易地找到bash在找不到命令時的作用:

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

然后,我們可以將此行為寫入具有可執行文件名的腳本,例如問題示例中的git

$ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM