मुझे पता है कि l="a b c"
,
echo $l | xargs ls
पैदावार
ls a b c
जो पैदावार पैदा करते हैं
mycommand -f a -f b -f c
मुझे पता है कि l="a b c"
,
echo $l | xargs ls
पैदावार
ls a b c
जो पैदावार पैदा करते हैं
mycommand -f a -f b -f c
जवाबों:
इसे करने का एक तरीका:
echo "a b c" | xargs printf -- '-f %s\n' | xargs mycommand
यह मानता है a
, b
और c
इसमें रिक्तियां, newlines, उद्धरण या बैकस्लैश शामिल नहीं हैं। :)
जीएनयू के साथ findutil
आप सामान्य मामले को संभाल सकते हैं, लेकिन यह थोड़ा अधिक जटिल है:
echo -n "a|b|c" | tr \| \\0 | xargs -0 printf -- '-f\0%s\0' | xargs -0 mycommand
आप बदल सकते हैं |
, कुछ अन्य चरित्र के साथ विभाजक कि में प्रकट नहीं होता a
, b
या c
।
संपादित करें: के रूप में @MichaelMol नोट, तर्कों की एक बहुत ही लंबी सूची के साथ वहाँ बहस करने के लिए पारित किया जा सकता है कि की अधिकतम लंबाई बह निकला का खतरा रहता है mycommand
। जब ऐसा होता है, तो अंतिम xargs
सूची को विभाजित कर देगा और उसकी एक और प्रतिलिपि चलाएगा mycommand
, और इसके अनधिकृत रूप से छोड़ने का जोखिम है -f
। यदि आप उस स्थिति के बारे में चिंता करते हैं, तो आप xargs -0
इस तरह से पिछले कुछ को बदल सकते हैं :
... | xargs -x -0 mycommand
यह समस्या को हल नहीं करेगा, लेकिन mycommand
जब तर्कों की सूची बहुत लंबी हो जाएगी तो यह चल रहा है ।
mycommand
। आप हमेशा -x
अंतिम में जोड़ सकते हैं xargs
।
xargs
, और बस उपयोग find
किया जा सकता है। यह समाधान खतरनाक है; आपको कम से कम अपने जवाब में विफलता के मामले की चेतावनी देनी चाहिए।
find
एक बेहतर सामान्य समाधान कैसे होगा, खासकर जब शुरुआती तर्क फ़ाइल नाम नहीं हैं। :)
-f
साथ, और उदाहरण के ls
लिए चित्रण के लिए उपयोग किए जाने वाले उपकरण के साथ , @ not-a-user फ़ाइलनाम के साथ काम कर रहा है। और दिया find
गया -exec
तर्क प्रदान करता है, जो आपको कमांड-लाइन बनाने की अनुमति देता है , यह ठीक है। (जब तक mycommand
इसे एक से अधिक बार निष्पादित करने की अनुमति है। यदि यह नहीं है, तो हमें xargs
यहां उपयोग के साथ एक और समस्या है ...)
इसे संबोधित करने का एक बेहतर तरीका (IMO) होगा:
में zsh
:
l=(a b c)
mycommand -f$^l
या सरणी ज़िपिंग का उपयोग करना ताकि तर्क विकल्प से जुड़ा न हो:
l=(a b c) o=(-f)
mycommand "${o:^^l}"
इस तरह, यह अभी भी काम करता है यदि l
सरणी में रिक्त स्थान या तत्व होते हैं जिनमें रिक्त स्थान या किसी अन्य समस्याग्रस्त चरित्र होते हैं xargs
। उदाहरण:
$ l=(a '' '"' 'x y' c) o=(-f)
$ printf '<%s>\n' "${o:^^l}"
<-f>
<a>
<-f>
<>
<-f>
<">
<-f>
<x y>
<-f>
<c>
में rc
:
l=(a b c)
mycommand -f$l
में fish
:
set l a b c
mycommand -f$l
(AFAIK, rc
और fish
कोई सरणी ज़िपिंग नहीं है)
पुराने शैली के बॉर्न-जैसे गोले की तरह bash
, आप हमेशा (अभी भी $@
सरणी के तत्वों में किसी भी वर्ण को अनुमति दे सकते हैं ):
set -- a b c
for i do set -- "$@" -f "$i"; shift; done
mycommand "$@"
for i; do args+=('-f' "$i");done;
mycommand "${args[@]}"
। IDK यदि यह तेज़ है, लेकिन किसी सरणी में 2 तत्वों को जोड़ना ऐसा लगता है जैसे कि यह O (n) होना चाहिए, जबकि आपका set
लूप संभवत: हर बार संचित arg सूची (O (n ^ 2)) को कॉपी करता है।
ARG_MAX
होने और होने का एक बहुत बदसूरत जोखिम चलाते हैं-f
।