Shell
帶命令的 SSH 不作為別名執行
我有以下命令可以遠端訪問本地伺服器和
tail -f
我擁有的應用程序的最新日誌文件。該命令在命令行中執行良好 -
ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'
問題是,當我將其設為別名(甚至是函式)時,它會評估
ls -1r
本地機器上的完成情況並嘗試將其傳遞給遠端機器。alias latestbotlogs="ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'" function latestbotlogs { ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)' }
我需要使用什麼語法才能在我通過 SSH 訪問的遠端電腦上評估整個命令。
提前致謝!
對於別名,您需要一些轉義
alias latestbotlogs="ssh user@hostname 'tail -f \\\$\\(ls -1r \\~/Development/python/twitter-bot/logs/*.log \\| head -1\\)'"
或者
alias latestbotlogs='ssh user@hostname '\''tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'\'
第二個版本更簡單,您不必考慮必須引用的所有運算符。
該功能應該按原樣工作。
獲得有些複雜的引號轉義權的替代方法:
alias botlogs='ssh user@host "ls -r ~/whatever/*log | head -1 | xargs tail -f"' # if (selected) filename contains backslash or quotemark(s) # need -d'\n' on GNU and I don't know good solution on other # this also fails if filename contains whitespace, but so did $( )
雖然我同意該功能應該在沒有任何黑客的情況下工作,並且通常功能更加一致和靈活,並且比別名更好。
PS:當
ls
輸出是管道(或重定向)時,它總是使用 1 列格式,你不需要-1
在這裡。