গ্রোভি শেল কমান্ড কার্যকর করছে


178

গ্রোভি কার্যকর শেলগুলি মোটামুটি সহজ করার জন্য executeপদ্ধতি যুক্ত করে String;

println "ls".execute().text

তবে যদি কোনও ত্রুটি ঘটে থাকে তবে ফলাফলের ফলাফল নেই। প্রমিত ত্রুটি এবং স্ট্যান্ডার্ড উভয়ই পেতে সহজ উপায় আছে? (কোডে একটি গুচ্ছ তৈরি করা ছাড়াও; উভয় ইনপুটস্ট্রিমগুলি পড়ার জন্য দুটি থ্রেড তৈরি করুন, তারপরে প্যারেন্ট স্ট্রিমটি ব্যবহারের জন্য অপেক্ষা করতে হবে তারপরে স্ট্রিংগুলিকে আবার পাঠ্যে রূপান্তর করতে হবে?)

ভালো কিছু লাগলে ভালো লাগবে;

 def x = shellDo("ls /tmp/NoFile")
 println "out: ${x.out} err:${x.err}"

এই লিঙ্কটি দরকারী। সিআরএল ডেমো দিয়ে কীভাবে শেল কমান্ড চালানো যায় তা দেখায়।
অনিকেত ঠাকুর

উত্তর:


207

ঠিক আছে, নিজেই সমাধান করুন;

def sout = new StringBuilder(), serr = new StringBuilder()
def proc = 'ls /badDir'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"

প্রদর্শন:

out> err> ls: cannot access /badDir: No such file or directory


13
আপনার যদি এই প্রক্রিয়াতে পরিবেশগত পরিবর্তনগুলিও সেট করতে হয় তবে শেলটিতে কমান্ডটি মোড়ানো নিশ্চিত করুন। উদাহরণস্বরূপ, env vars সহ পারফোরস কমান্ড চালানো:envVars = ["P4PORT=p4server:2222", "P4USER=user", "P4PASSWD=pass", "P4CLIENT=p4workspace"]; workDir = new File("path"); cmd = "bash -c \"p4 change -o 1234\""; proc = cmd.execute(envVars, workDir);
নোয়াম মানস

@ পল_সনস ওপি প্রশ্নের সাথে সম্পর্কিত নয়, তবে আমি মনে করি আধুনিক জেভিএমগুলি অপরিবর্তিত সিঙ্ক্রোনাইজেশন ঠিকঠাকভাবে পরিচালনা করে handle সুতরাং স্ট্রিংবাফার থ্রেডে বা স্ট্যাক-সীমাবদ্ধ পরিস্থিতিতে পারফরম্যান্স হ্রাস করার সম্ভাবনা নেই।
পাভেল গ্র্যাসেটস্কি

3
দস্তাবেজগুলি বলে যে আমাদের ওয়েটফ্রোস প্রসেসআউটপুট () ব্যবহার করা উচিত - "আউটপুটটি পুরোপুরি গ্রাস হওয়ার জন্য অপেক্ষা করার জন্য কল করুন অপেক্ষা করুনপ্রসেসআউটপুট ()"। সূত্র: ডকস.groovy-lang.org/latest/html/groovy-jdk/java/lang/…
শ্রীকান্ত

4
@ শ্রীকান্ত ওয়েটফ্রোস প্রসেস () আউটপুট ডকস এও বলেছে যে "আপনি যদি স্ট্যান্ডার্ড বা ত্রুটির আউটপুট সম্পর্কে চিন্তা করেন না এবং কেবল প্রক্রিয়াটি নিঃশব্দে চালিত করতে চান তবে এই আউটপুটটি চান - আমি আউটপুটটি চাই
বব হার্মম্যান

ওয়েটফোর্ডারকিলের পরেও সাউট এবং সেরার পাওয়া যাবে না। একটি প্রিন্টলিনের পরিবর্তে একটি প্রতিস্থাপন ব্যবহার করে পরীক্ষিত। ডক্স বলছে: "এর জন্য দুটি থ্রেড শুরু হয়েছে, সুতরাং এই পদ্ধতিটি তত্ক্ষণাত্ ফিরে আসবে wait থ্রেডগুলি () এডটিতে যোগ দেওয়া হবে না, এমনকি ওয়েটফোর () বলা হলেও the আউটপুট পুরোপুরি গ্রাস হওয়ার জন্য অপেক্ষা করুন প্রপোজ আউটপুট () । "
solstice333

48

"ls".execute()একটি Processবস্তুর রিটার্ন করে যা "ls".execute().textকাজ করে। কোনও ত্রুটি আছে কিনা তা নির্ধারণ করতে আপনার কেবল ত্রুটি প্রবাহটি পড়তে সক্ষম হওয়া উচিত।

একটা অতিরিক্ত পদ্ধতি চালু আছে Processযে আপনি একটি পাস করার অনুমতি দেয় StringBufferটেক্সট পুনরুদ্ধার করতে: consumeProcessErrorStream(StringBuffer error)

উদাহরণ:

def proc = "ls".execute()
def b = new StringBuffer()
proc.consumeProcessErrorStream(b)

println proc.text
println b.toString()

এটি বোর্ন অ্যাগেইন শেল স্ক্রিপ্টের সাথে কাজ করছে না! # / বিন / বাশ,
রশ্মি জৈন

1
ব্যাশ স্ক্রিপ্ট নিয়ে কাজ করেন, তাহলে আপনি আপনি সম্ভবত কমান্ডের অংশ হিসাবে ব্যাশ ডাকা: "/ বিন / ব্যাশ স্ক্রিপ্ট" .execute ()
নিল্স Bech নিলসেন

32
// a wrapper closure around executing a string                                  
// can take either a string or a list of strings (for arguments with spaces)    
// prints all output, complains and halts on error                              
def runCommand = { strList ->
  assert ( strList instanceof String ||
           ( strList instanceof List && strList.each{ it instanceof String } ) \
)
  def proc = strList.execute()
  proc.in.eachLine { line -> println line }
  proc.out.close()
  proc.waitFor()

  print "[INFO] ( "
  if(strList instanceof List) {
    strList.each { print "${it} " }
  } else {
    print strList
  }
  println " )"

  if (proc.exitValue()) {
    println "gave the following error: "
    println "[ERROR] ${proc.getErrorStream()}"
  }
  assert !proc.exitValue()
}

10
+1 আউটপুটটি উত্পন্ন হওয়ার সাথে সাথে আউটপুটটি ক্রমবর্ধমান দেখায় ... দীর্ঘ চলমান প্রক্রিয়ার জন্য যা অত্যন্ত গুরুত্বপূর্ণ
সমরজিৎ সামন্ত

সেখানে দুর্দান্ত শেয়ার করুন @ mholm815
জিমি ওবনিও Abor

2
এই সমাধানটি ব্যবহার করতে, নিম্নলিখিত লাইনটি ইস্যু করুন:runCommand("echo HELLO WORLD")
মিরন ভি

@ mholm815 আমরা কীভাবে পাইপলাইন থেকে প্রয়োজনীয় স্ক্রিপ্টগুলি অনুমোদন করতে পারি?
রোনাক প্যাটেল

25

আমি এটি আরও বুদ্ধিমান খুঁজে পাই:

def proc = "ls foo.txt doesnotexist.txt".execute()
assert proc.in.text == "foo.txt\n"
assert proc.err.text == "ls: doesnotexist.txt: No such file or directory\n"

অন্য পোস্টে যেমন উল্লেখ করা হয়েছে, এগুলি কলগুলি ব্লক করা হচ্ছে, তবে যেহেতু আমরা আউটপুট নিয়ে কাজ করতে চাই, এটি প্রয়োজনীয় হতে পারে।


24

উপরের সরবরাহিত উত্তরগুলিতে আরও একটি গুরুত্বপূর্ণ তথ্য যুক্ত করতে -

একটি প্রক্রিয়া জন্য

def proc = command.execute();

সর্বদা ব্যবহার করার চেষ্টা করুন

def outputStream = new StringBuffer();
proc.waitForProcessOutput(outputStream, System.err)
//proc.waitForProcessOutput(System.out, System.err)

বরং

def output = proc.in.text;

গ্রোভিতে কমান্ড কার্যকর করার পরে আউটপুটগুলি ক্যাপচার করা কারণ পরেরটি একটি ব্লকিং কল ( কারণ হিসাবে এসও প্রশ্ন )।


5
def exec = { encoding, execPath, execStr, execCommands ->

def outputCatcher = new ByteArrayOutputStream()
def errorCatcher = new ByteArrayOutputStream()

def proc = execStr.execute(null, new File(execPath))
def inputCatcher = proc.outputStream

execCommands.each { cm ->
    inputCatcher.write(cm.getBytes(encoding))
    inputCatcher.flush()
}

proc.consumeProcessOutput(outputCatcher, errorCatcher)
proc.waitFor()

return [new String(outputCatcher.toByteArray(), encoding), new String(errorCatcher.toByteArray(), encoding)]

}

def out = exec("cp866", "C:\\Test", "cmd", ["cd..\n", "dir\n", "exit\n"])

println "OUT:\n" + out[0]
println "ERR:\n" + out[1]

3
আমি সত্যিই বিরক্ত যে একজন ব্যক্তি উত্তর দেওয়ার জন্য সময় নিয়েছিল এবং কোনও আপাত কারণ ছাড়াই কেউ এটিকে হ্রাস করেছে। যদি এটি একটি সম্প্রদায় হয় তবে ডাউনওয়েটটি ব্যাখ্যা করে একজনকে মন্তব্য যুক্ত করার বাধ্যবাধকতা বোধ করা উচিত (যদি না এটি কোনও সুস্পষ্ট কারণ যে কোনও দক্ষ প্রোগ্রামার অবিলম্বে দেখতে পান) see
আমোস বোর্দোভিটস

4
@ আমোসবোর্ডউইটস প্রচুর উত্তর ডাউনভোটস পান। এটি ঠিক আছে, এটি একটি ডাউনভোট। এটি বলেছিল, এটি কারণ হতে পারে কারণ এটি কোনও কোডের ব্যাখ্যা নেই - সর্বদা ভালভাবে গ্রহণ করা হয় না।
ক্রিস বেকার

@ ক্রিসবেকার তাই কেন এটি উল্লেখ করবেন না? আপনি নিজেই ইতিবাচক নন যে এটি কারণ! ..
আমোস বোর্দোভিটস

4
@ আমসবার্ডোভিটস আমি সরকারী ডাউনভোটের ব্যাখ্যাকারী নই, আমি আপনাকে কেন বলতে পারব না এবং এটি বোধগম্য যে আমি অন্য একজনের গৃহীত পদক্ষেপের কথা বলছি বলে আমি নিশ্চিত নই। আমি একটি সম্ভাবনা প্রস্তাব। ডাউনভোটকে কেন ব্যাখ্যা করবেন না, অবশ্যই, উত্তরে কোডটি কেন ব্যাখ্যা করবেন না? যাইহোক, আমি নিশ্চিত আমরা সবাই ঠিক থাকব।
ক্রিস বেকার

1
@ ক্রিসবেকার আমি এ জাতীয় কোনও দাবি কখনও করেনি ("তবে আমার ধারণা আপনি আরও ভাল জানেন")। এটি একটি শালীন জিনিস, জ্ঞানের জিনিস নয় ..
Amos Bordowitz

-3
command = "ls *"

def execute_state=sh(returnStdout: true, script: command)

তবে কমান্ড ব্যর্থ হলে প্রক্রিয়াটি শেষ হয়ে যাবে


কোথা shথেকে আসে?
styl3r

3
shজেনকিনস গ্রোভি ডিএসএল এর অংশ। সম্ভবত এখানে দরকারী নয়
Gi0rgi0s

4
জেনকিনস
গ্রোভী

অন্যরা যেমন বলেছে, এটি জেনকিনস ডিএসএল
জোনিপনি 3

এই উত্তরটি জিজ্ঞাসা করা প্রশ্নে প্রযোজ্য নয়।
ব্র্যান্ডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.