سؤال

لقد واجهت مشكلة غريبة مع روبي لا يمكنني شرحها. لديّ البرنامج النصي التالي الذي يمسك بأي رمز موجود حاليًا في الحافظة ، ويقوم بتشغيله عبر دقة بناء الجملة ، ثم يعيد الإصدار الجديد إلى الحافظة:

#!/usr/bin/ruby1.9.1

require 'coderay'

language = "auto";
if(ARGV.length > 0)
    language = ARGV[0];
end

print("Using language: #{language} \n");

codeToHighlight = `xsel --clipboard`

highlightedCode = CodeRay.scan(codeToHighlight, language.intern()).div

IO.popen("xsel --clipboard", mode='w') do |io|
  io.write highlightedCode
  io.flush
end

الجزء الغريب هو أنه إذا قمت بتشغيله مباشرة داخل محطة ، فإنه يعمل بشكل جيد. إذا قمت بتشغيله عبر "Xterm -e" ، فإنه لا يعمل. لقد وجدت هذا الموضوع على موقع آخر طرح نفس السؤال ، لكن الشخص لم يحصل على إجابة: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/138423

وجد ذلك الشخص أنه إذا أضافوا توقفًا مؤقتًا في نهاية البرنامج النصي مثل ...

10000.times do
   puts ""
end

...إنها تعمل. لماذا هذا؟ هل هناك طريقة لإصلاح هذا؟ حاولت إعادة كتابة البرنامج النصي بحيث يعيد Popen كائن IO ويمكنني الاتصال يدويًا بإغلاق ، لكن هذا لا يحدث فرقًا.

هل كانت مفيدة؟

المحلول

ماذا لو قمت بتنفيذها باستخدام Gnome -terminal -e بدلاً من Xterm -e؟

تحديث:

حسنًا ، هذا هو أفضل تخمين لي. أنت تعرف كيف إذا أرسلت برنامجًا طرفيًا إلى الخلفية (إما مع & بعد الأمر أو مع ctl-z) ثم تغلق المحطة التي تقتل البرنامج ، أليس كذلك؟ حسنًا ، Xsel Forks عملية طفل للكتابة إلى الحافظة ، ولكن يجب أن يتم قتلها عندما ينتهي البرنامج النصي Ruby Wrapper ويغلق Xterm.

هذا من شأنه أن يفسر لماذا يتيح التوقف في النهاية العمل - إنه يمنح فقط وقتًا كافيًا لعملية الطفل قبل الانتهاء من المحطة. وهذا ما يفسر أيضًا سبب عمله عند التشغيل يدويًا - تترك المحطة مفتوحة لفترة كافية حتى تنتهي عملية الطفل.

حاول إضافة -n خيار لأمر XSEL الخاص بك ، وأراهن أنه يعمل. -n يمنع Xsel من Forking.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top