খালি শেল ভেরিয়েবল ব্যবহার করার সময় একটি ত্রুটি জারি করুন


22

$PROJECT_HOME/*প্রকল্পের সমস্ত ফাইল মুছতে কখনও কখনও আমি ব্যবহার করি । যখন পরিবেশের পরিবর্তনশীল PROJECT_HOMEসেট করা থাকে না (কারণ আমি করেছি suএবং নতুন ব্যবহারকারীর কাছে এই পরিবেশের পরিবর্তনশীল সেট নেই) তখন এটি রুট ফোল্ডার থেকে সমস্ত ফাইল মুছতে শুরু করে। এটি apocalyptic।

আমি bashযখন শেলটিতে একটি অপরিবর্তিত পরিবেশ পরিবর্তনশীল ব্যবহার করি তখন ত্রুটি নিক্ষেপ করতে কীভাবে কনফিগার করব?


5
set -uআপনি যা চান তা করবে
কিউংলম

আপনি কি উত্তর হিসাবে এটি করতে পারেন?

2
অবশ্যই আপনি আপনার vars খালি স্ট্রিংগুলিতে আরম্ভ করবেন না। খুব [ -z "$VAR" ]অবিশ্রুত সাথে কাজ VARকরে। ইনিশিয়েশনটি কেবল অযাচিত আচরণ দেখানোর জন্য ছিল — আমার বক্তব্যটি হ'ল, যদি আপনার বারগুলি যদি কোনওভাবেই খালি স্ট্রিংগুলিতে আরম্ভ হয় এবং আপনি rm -r "$PROJECT_HOME"/*ভুলভাবে নির্ভর করে চালিত হন তবে set -uআপনি "অ্যাপোক্যালिप्टিক" আচরণ পাবেন। IHMO, আপনার কম্পিউটারের সম্পূর্ণ বিষয়বস্তু সুরক্ষার জন্য দুঃখের চেয়ে নিরাপদ থাকা ভাল। set -uনিরাপদ নয়।
পিএসকোকিক

3
"এটা খুব দীর্ঘ"? ম্যানুয়ালি বিপজ্জনক অপারেশন করার জন্য আপনার কোনও সুবিধাজনক উপায়ের সন্ধান করা উচিত নয় । পরিবর্তে, আপনি যা চান তা করতে আপনার একটি ফাংশন, ওরফে বা স্ক্রিপ্ট তৈরি করা উচিত; এই ক্ষেত্রে, @ পিএসকোকিকের প্রস্তাবিত কমান্ড থেকে একটি উপনাম তৈরি করা নিরাপদ এবং সুবিধাজনক উভয়ই হবে ।
কাইল স্ট্র্যান্ড

1
যদি ব্যবহারকারী সেট করে PROJECT_HOME=/etc? মহাশূন্য প্রতিরোধের জন্য কেবল একটি খালি মান পরীক্ষা করা যথেষ্ট নয়। রুট হিসাবে চলার সময় অবিশ্বস্ত ব্যবহারকারীদের কাছ থেকে আপনার পরিবর্তনশীল ব্যবহার করা উচিত নয়।
বর্মার

উত্তর:


27

পসিক্স শেল-এ আপনি সেট-ইউ ব্যবহার করতে পারেন :

#!/bin/sh

set -u
: "${UNSET_VAR}"

বা প্যারামিটার সম্প্রসারণ ব্যবহার :

: "${UNSET_VAR?Unset variable}"

আপনার ক্ষেত্রে, আপনার সেট :?পরিবর্তে ?খালি ভেরিয়েবলের পরিবর্তে ব্যবহার করা উচিত :

rm -rf -- "${PROJECT_HOME:?PROJECT_HOME empty or unset}"/*

17
[ -z "$PROJECT_HOME" ] || rm -r "$PROJECT_HOME"/*

এই ক্ষেত্রে যেখানে ফেলবো PROJECT_HOME হয় সেট কিন্তু কিছু থাকে না।

উদাহরণ:

1) এটি আপনার সিস্টেমে মুছে ফেলতে পারে এমন সমস্ত কিছু মুছে ফেলবে (ভিতরে ডটফাইলগুলি ব্যতীত /(সাধারণত কোনও কিছুই থাকে না)):

set -u
PROJECT_HOME=
rm -r "$PROJECT_HOME"/*

2) এটি কিছুই করবে না:

PROJECT_HOME=
[ -z "$PROJECT_HOME" ] || rm -r "$PROJECT_HOME"/* 

আপনার প্রকল্পের বাড়ি পুরোপুরি সরিয়ে ফেলা এবং এটি পুনরুদ্ধার করা অন্য বিকল্প হতে পারে (আপনি যদি ডটফাইলগুলি থেকেও মুক্তি পেতে চান):

#no apocalyptic threats in this scenario
rm -r "$PROJECT_HOME"
mkdir "$_" 

1
-zঠিক আছে, তবে যেহেতু $PROJECT_HOMEএকটি ডিরেক্টরি হওয়ার কথা, -dতাই আরও ভাল হতে পারে। [[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
কোজিরো

2
যদি PROJECT_Home কোনও ননডাইরেক্টরিতে সেট করা থাকে তবে এটি একটি নন-ক্যাটাস্ট্রোফিক ত্রুটি, সম্ভবত টাইপের কারণে। -dচেক যে ত্রুটি আড়াল হবে। আমি মনে করি এটি যদি আরও এগিয়ে যায় rmএবং rmউচ্চস্বরে এটির জন্য অভিযোগ করে।
পিএসকোকিক

2
যদি PROJECT_Home সেট করা থাকে তবে নামটি ডিরেক্টরি নয় তবে [[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"নীরবে কিছুই করবে না। তবে [[ -z $PROJECT_HOME ]] || rm -r "$PROJECT_HOME"এটি ডিরেক্টরি না হলেও এমন কোনও ফাইল হলেও নিঃশব্দে "$ PROJECT_HOME" মুছে ফেলবে। ত্রুটির বার্তা পাওয়া কখনই সমস্যা নয়:if [[ -d $PROJECT_HOME ]]; then rm -r "$PROJECT_HOME"; else printf '%s is not a directory\n' "$PROJECT_HOME" >&2; fi
কোজিরো

1
এখন "দুর্ঘটনাক্রমে" সেট PROJECT_HOME="/."...
হ্যাগেন ভন ইটজেন

1
@ হ্যাগেনভোন এটজেন যদি PROJECT_Home কে রুটে সেট করা থাকে, তবে PROJECT_Home খালি করার পদ্ধতিটি মূলটি খালি করবে। এটি প্রত্যাশিত এবং পুরোপুরি যুক্তিসঙ্গত আচরণ। এবং আপনি এমনকি চূড়ান্ত বিন্দু প্রয়োজন হয় না।
পিএসকোকিক

0

এটি করার আরেকটি উপায়:

rm -r "${somevar:-/tmp/or_this_if_somevar_is_empty}"/*

অনেকগুলি পরিবর্তনীয় বিকল্প রয়েছে, উপরের একটিটি যখন "সামোয়ার" খালি থাকে (এবং সেই ক্ষেত্রে এটি মুছতে চেষ্টা করে /tmp/or_this_if_somevar_is_empty/*)


1
বা: rm -fr ${ENV_VAR:?suitably caustic message here}/*, কিন্তু এটি এখনও মূল্য পরীক্ষণ যে মান রুট ডিরেক্টরিটি ম্যাপ নয়, লক্ষ সেখানে সহজ পরীক্ষা পরাভূত করে অনেক উপায় আছে যে হতে পারে: //, /.., /usr/who/../.., ...
জনাথন Leffler

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