কোনও কমান্ড ব্যর্থ হলে মেকিং বন্ধ করবেন না, তবে প্রস্থান স্থিতি পরীক্ষা করুন


22

আমি জিএনইউ মেক 3.81 কে নির্দেশ দেওয়ার চেষ্টা করছি যে কোনও কমান্ড ব্যর্থ হলে (থামাতে না দিয়ে কমান্ডটি উপস্থাপন -করি) থামাতে তবে আমি পরবর্তী কমান্ডের প্রস্থান স্থিতিটি পরীক্ষা করে আরও তথ্যমূলক বার্তা প্রিন্ট করতে চাই। তবে নীচে আমার মেকফাইল ব্যর্থ হয়েছে:

$ cat Makefile 
all:
    -/bin/false
    ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!

উপরের মেকফিলটি কেন "সাফল্য!" পরিবর্তে "ব্যর্থতা!" ?

হালনাগাদ:

গ্রহণযোগ্য উত্তরের অনুসরণ ও প্রসারিত, নীচে এটি কীভাবে লেখা উচিত তা নিচে দেওয়া হয়েছে:

failure:                                                                                                                                                                                                                                      
    @-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"                                                                                                                                                                 
success:                                                                                                                                                                                                                                      
    @-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"     

2
আপনি .ONESHELL:নির্দেশটি তদন্ত করতে চাইতে পারেন ।
জোনাথন লেফলার

.ONESHL একটি শেলের সমস্ত রসিদ ব্লক চালাবে যা কার্যকর হয়েছে: প্রথম কমান্ড ব্যর্থ হলে পরবর্তী সমস্যাগুলি ছাড়াই কার্যকর করা হবে। এটি রোধ .SHELLFLAGS = -ecকরতে ব্যবহার করা উচিত। তবে এই ক্ষেত্রে আপনি -আরও উপসর্গ ব্যবহার করতে পারবেন না (প্রাপ্তির ব্যক্তিগত কমান্ডের জন্য) কারণ মেক লিখবে যে ত্রুটিটিকে অগ্রাহ্য করা হয়েছে তবে তবুও সমস্ত ব্লক ব্যর্থ হবে। সুতরাং, || :কমান্ড উপেক্ষা করার একটি সমাধান। তবে এটি ক্রস প্ল্যাটফর্ম নয় (উইন্ডোজের নেই || :বা আছে || true)
পল-এজি

উত্তর:


14

মেকফাইল নিয়মে প্রতিটি আপডেট কমান্ড পৃথক শেলের মধ্যে কার্যকর করা হয়। তো $? পূর্ববর্তী ব্যর্থ কমান্ডের প্রস্থান স্থিতি থাকে না, এতে ডিফল্ট মান whatever এর জন্য যা থাকে তা রয়েছে? একটি নতুন শেল মধ্যে এজন্যই আপনার [$? -eq 0] পরীক্ষা সর্বদা সফল হয়।


10

আপনি পরীক্ষা প্রয়োজন হবে না $?যেহেতু &&কাজ করে $?শূন্য হয় এবং ||একটি নন-জিরো ফেরত মান ক্ষেত্রে এগিয়ে যেতে হয়।

এবং আপনার বিয়োগের দরকার নেই যেহেতু তৈরির জন্য রিটার্ন মানটি লাইনের শেষ অগ্রিম প্রোগ্রাম কল থেকে নেওয়া হয়। সুতরাং এটি সূক্ষ্ম কাজ করে

ব্যর্থতা:

      @/bin/false && echo "success!" || echo "failure!" 

সাফল্য:

      @/bin/true && echo "success!" || echo "failure!"

বিপরীতটি ঘটে: আপনি যদি নিজের বার্তাটি করতে চান এবং কোনও শূন্য-মান না দিয়ে কোনওভাবেই মেক প্রক্রিয়াটি ভেঙে ফেলতে চান, আপনাকে এই জাতীয় কিছু লিখতে হবে:

ব্যর্থতা:

      @/bin/false && echo "success!" || { echo "failure!"; exit 1; }

8

জিএনইউ থেকে নথি তৈরি করুন :

'-' বা '-i' পতাকাটির কারণে যখন ত্রুটিগুলি উপেক্ষা করা হয়, তখন ট্রিটগুলিকে সাফল্যের মতোই ফিরে আসার চেষ্টা করুন , ব্যতীত এটি কোনও বার্তা প্রিন্ট করে যা আপনাকে শেলটি থেকে বেরিয়ে আসা স্থিতির কোডটি বলে এবং ত্রুটি উপেক্ষা করা হয়েছে যে বলে।

makeএর মতো ক্ষেত্রে প্রস্থান করার স্থিতিটি ব্যবহার করতে , makeস্ক্রিপ্ট থেকে চালনা করুন :

#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"

এবং আপনার মেকফাইলে রয়েছে:

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