[英]How do I use line output from a command as separate file names in bash?
我正在嘗試干凈無錯誤地通過vim文本編輯器中的命令行打開多個文件。 我正在使用bash作為我的外殼。 具體來說,我想在當前工作目錄中打開前23個文件。 我的初始命令是:
$ ls | head -23 | xargs vim
但是,當我這樣做時,在打開所有文件之前,我收到以下錯誤消息:
Vim:警告:輸入不是來自終端
vim退出后,終端中不會顯示新文本。 除了重新打開一個新終端外,我還必須盲目地進行一次reset
以恢復正常的終端。
這似乎在這里討論: 在gnu屏幕上使用xargs vim ,以及: 為什么“查找文件名| xargs vim”會導致奇怪的終端行為?
由於發生了警告,因此xargs似乎對vim是禁忌。 (除非您使用子shell和輸入/輸出重定向來做一些令人費解的事情,但我不太喜歡它作為常用命令。並且使用別名/函數... meh。)
解決方案似乎是使用bash的命令替換。 所以我嘗試了:
$ vim $(ls | head -23)
但是文件中包含空格和括號,格式如下:
surname, firstname(email).txt
因此,shell所做的工作(在xarg情況下也是這樣)是提供surname,
和firstname(email).txt
作為兩個單獨的命令參數,這使我在vim中至少擁有要打開的文件數量的兩倍, 但我實際上都不想打開任何文件。
因此,我認為我需要以某種方式轉義文件名。 我試圖引用命令:
$ vim "$(ls | head -23)"
然后,shell將替換的整個輸出串聯起來,並將其作為單個命令參數提供,因此我剩下一個超長文件名,這也不是我想要的。
我也試圖與工作-exec
, -print
, -print0
和-printf
選項find
,與在bash陣列的各種事情,可能有些事情我不記得了。 我現在很茫然。
如何使用來自命令的文件名作為單獨的命令參數並用引號引起來,以便它們實際起作用?
感謝您提供的所有幫助!
這是一個基於數組的解決方案:
fileset=(*)
vim "${fileset[@]:0:23}"
xargs -a <(ls | head -23) -d '\n' vim
-a
告訴xargs從命名文件而不是stdin中讀取參數。 <(...)
讓我們在需要文件名的地方傳遞ls / head管道的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.