Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> बाश प्रोग्रामिंग

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

शेल स्क्रिप्टिंग लिनक्स में प्रोसेस ऑटोमेशन का एक महत्वपूर्ण हिस्सा है। स्क्रिप्टिंग आपको किसी फ़ाइल में आदेशों का एक क्रम लिखने और फिर उन्हें निष्पादित करने में मदद करती है।

यह आपका समय बचाता है क्योंकि आपको बार-बार कुछ कमांड लिखने की आवश्यकता नहीं होती है। आप दैनिक कार्यों को कुशलतापूर्वक कर सकते हैं और उन्हें स्वचालित निष्पादन के लिए शेड्यूल भी कर सकते हैं।

आप स्टार्टअप पर निष्पादित करने के लिए कुछ स्क्रिप्ट भी सेट कर सकते हैं जैसे कि एक नया सत्र शुरू करने पर एक विशेष संदेश दिखाना या कुछ पर्यावरण चर सेट करना।

स्क्रिप्टिंग के अनुप्रयोग और उपयोग असंख्य हैं, तो आइए जानते हैं।

इस लेख में, आप सीखेंगे:

  1. बैश शेल क्या है?
  2. बैश स्क्रिप्ट क्या है और आप इसे कैसे पहचानते हैं?
  3. अपनी पहली बैश स्क्रिप्ट कैसे बनाएं और इसे कैसे निष्पादित करें।
  4. शेल स्क्रिप्टिंग का मूल सिंटैक्स।
  5. सिस्टम की शेड्यूल्ड स्क्रिप्ट कैसे देखें।
  6. क्रॉन जॉब्स के माध्यम से शेड्यूल करके स्क्रिप्ट को स्वचालित कैसे करें।

सीखने का सबसे अच्छा तरीका अभ्यास करना है। मैं आपको रिप्लिट का उपयोग करने के साथ-साथ अनुसरण करने के लिए अत्यधिक प्रोत्साहित करता हूं। आप चल रहे Linux शेल को मिनटों में एक्सेस कर सकते हैं.

बैश शेल का परिचय

लिनक्स कमांड लाइन शेल नामक प्रोग्राम द्वारा प्रदान की जाती है। इन वर्षों में, विभिन्न विकल्पों को पूरा करने के लिए शेल कार्यक्रम विकसित हुआ है।

विभिन्न शेल का उपयोग करने के लिए विभिन्न उपयोगकर्ताओं को कॉन्फ़िगर किया जा सकता है। लेकिन अधिकांश उपयोगकर्ता वर्तमान डिफ़ॉल्ट शेल के साथ रहना पसंद करते हैं। कई लिनक्स डिस्ट्रो के लिए डिफ़ॉल्ट शेल जीएनयू बॉर्न-अगेन शेल (बैश) है। बैश के बाद बॉर्न शेल (sh )।

जब आप पहली बार शेल लॉन्च करते हैं, तो यह .bashrc . में स्थित स्टार्टअप स्क्रिप्ट का उपयोग करता है या .bash_profile फ़ाइल जो आपको शेल के व्यवहार को अनुकूलित करने की अनुमति देती है।

जब एक शेल को अंतःक्रियात्मक रूप से उपयोग किया जाता है, तो यह एक $ प्रदर्शित करता है जब यह उपयोगकर्ता से आदेश की प्रतीक्षा कर रहा है। इसे शेल प्रांप्ट कहा जाता है।

[username@host ~]$

यदि शेल रूट के रूप में चल रहा है, तो प्रॉम्प्ट को # . में बदल दिया जाता है . सुपरयुसर शेल प्रॉम्प्ट इस तरह दिखता है:

[root@host ~]#

बैश बहुत शक्तिशाली है क्योंकि यह कुछ ऐसे कार्यों को सरल बना सकता है जिन्हें जीयूआई के साथ कुशलतापूर्वक पूरा करना मुश्किल है। याद रखें कि अधिकांश सर्वरों में GUI नहीं होता है, और कमांड लाइन इंटरफ़ेस (CLI) की शक्तियों का उपयोग करना सीखना सबसे अच्छा है।

बैश स्क्रिप्ट क्या है?

एक बैश स्क्रिप्ट एक फ़ाइल में लिखे गए आदेशों की एक श्रृंखला है। इन्हें बैश प्रोग्राम द्वारा पढ़ा और निष्पादित किया जाता है। कार्यक्रम लाइन से लाइन निष्पादित करता है।

उदाहरण के लिए, आप एक निश्चित पथ पर नेविगेट कर सकते हैं, एक फ़ोल्डर बना सकते हैं और कमांड लाइन का उपयोग करके उसके अंदर एक प्रक्रिया शुरू कर सकते हैं।

आप बैश स्क्रिप्ट में कमांड को सेव करके और इसे चलाकर चरणों का समान क्रम कर सकते हैं। आप स्क्रिप्ट को कितनी भी बार चला सकते हैं।

आप बैश स्क्रिप्ट की पहचान कैसे करते हैं?

.sh का फ़ाइल एक्सटेंशन ।

परम्पराओं के नामकरण से, बैश स्क्रिप्ट एक .sh . के साथ समाप्त होती है . हालांकि, बैश स्क्रिप्ट sh . के बिना पूरी तरह से ठीक चल सकती हैं विस्तार।

स्क्रिप्ट एक बैश बैंग से शुरू होती है।

लिपियों की पहचान shebang . से भी की जाती है . शेबांग bash # . का एक संयोजन है और bang ! बैश शेल पथ का अनुसरण किया। यह लिपि की पहली पंक्ति है। शेबांग शेल को बैश शेल के माध्यम से निष्पादित करने के लिए कहता है। शेबांग बैश दुभाषिया के लिए एक पूर्ण मार्ग है।

नीचे शेबांग कथन का एक उदाहरण दिया गया है।

#! /bin/bash

बैश प्रोग्राम का पथ भिन्न हो सकता है। हम बाद में देखेंगे कि इसे कैसे पहचाना जाए।

निष्पादन अधिकार

स्क्रिप्ट को निष्पादित करने वाले उपयोगकर्ता के लिए निष्पादन अधिकार हैं।

एक निष्पादन अधिकार x . द्वारा दर्शाया जाता है . नीचे दिए गए उदाहरण में, मेरे उपयोगकर्ता के पास rwx है फ़ाइल के अधिकार (पढ़ें, लिखें, निष्पादित करें) test_script.sh

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

फ़ाइल का रंग

निष्पादन योग्य स्क्रिप्ट बाकी फ़ाइलों और फ़ोल्डरों से भिन्न रंग में दिखाई देती हैं।

मेरे मामले में, निष्पादन अधिकार वाली स्क्रिप्ट हरे रंग की दिखाई देती हैं।

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

अपनी पहली बैश स्क्रिप्ट कैसे बनाएं

आइए बैश में एक साधारण स्क्रिप्ट बनाएं जो Hello World . को आउटपुट करे ।

hello_world.sh नाम की एक फाइल बनाएं

touch hello_world.sh

अपने बैश शेल का पथ खोजें।

which bash
शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

मेरे मामले में, पथ है /usr/bin/bash और मैं इसे शेबैंग में शामिल करूंगा।

आदेश लिखें।

हम echo करेंगे कंसोल के लिए "हैलो वर्ल्ड"।

हमारी स्क्रिप्ट कुछ इस तरह दिखेगी:

#! usr/bin/bash
echo "Hello World"

फ़ाइल को संपादित करें hello_world.sh अपनी पसंद के टेक्स्ट एडिटर का उपयोग करके उसमें उपरोक्त पंक्तियां जोड़ें।

अपने उपयोगकर्ता को निष्पादन अधिकार प्रदान करें।

फ़ाइल अनुमतियों को संशोधित करें और नीचे दिए गए आदेश का उपयोग करके स्क्रिप्ट के निष्पादन की अनुमति दें:

chmod u+x hello_world.sh

chmod किसी विशेष उपयोगकर्ता के लिए फ़ाइल के मौजूदा अधिकारों को संशोधित करता है। हम +x जोड़ रहे हैं उपयोगकर्ता के लिए u

स्क्रिप्ट चलाएँ।

आप स्क्रिप्ट को निम्न तरीकों से चला सकते हैं:

./hello_world.sh

bash hello_world.sh

यह रहा आउटपुट:

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

बैश स्क्रिप्टिंग का मूल सिंटैक्स

किसी भी अन्य प्रोग्रामिंग भाषा की तरह, बैश स्क्रिप्टिंग कंप्यूटर द्वारा समझने योग्य प्रोग्राम बनाने के लिए नियमों के एक सेट का पालन करती है। इस खंड में, हम बैश स्क्रिप्टिंग के सिंटैक्स का अध्ययन करेंगे।

चरों को कैसे परिभाषित करें

हम सिंटैक्स variable_name=value . का उपयोग करके एक वेरिएबल को परिभाषित कर सकते हैं . वेरिएबल का मान प्राप्त करने के लिए, $ add जोड़ें चर से पहले।

#!/bin/bash
# A simple variable example
greeting=Hello
name=Tux
echo $greeting $name
शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

टक्स, लिनक्स शुभंकर, पेंगुइन का भी नाम है।

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

अंकगणित व्यंजक

गणितीय गणना के लिए बैश द्वारा समर्थित ऑपरेटर नीचे दिए गए हैं:

ऑपरेटर उपयोग
+ जोड़
- घटाव
* गुणा
/ डिवीजन
** घातांक
% मापांक

आइए कुछ उदाहरण चलाते हैं।

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

नीचे दिए गए सिंटैक्स का उपयोग करके संख्यात्मक अभिव्यक्तियों की गणना और एक चर में संग्रहीत किया जा सकता है:

var=$((expression))

आइए एक उदाहरण देखें।

#!/bin/bash

var=$((3+9))
echo $var
शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

उपरोक्त विधियों का उपयोग करके भिन्नों की सही गणना नहीं की जाती है और उन्हें काट दिया जाता है।

दशमलव गणना . के लिए , हम bc . का उपयोग कर सकते हैं दशमलव स्थानों की एक विशेष संख्या में आउटपुट प्राप्त करने के लिए कमांड। bc (बैश कैलकुलेटर) एक कमांड लाइन कैलकुलेटर है जो दशमलव बिंदुओं की एक निश्चित संख्या तक गणना का समर्थन करता है।

echo "scale=2;22/7" | bc

जहां scale आउटपुट में आवश्यक दशमलव स्थानों की संख्या को परिभाषित करता है।

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

उपयोगकर्ता इनपुट कैसे पढ़ें

कभी-कभी आपको उपयोगकर्ता इनपुट एकत्र करने और प्रासंगिक संचालन करने की आवश्यकता होगी।

बैश में, हम read . का उपयोग करके उपयोगकर्ता इनपुट ले सकते हैं आदेश।

read variable_name

उपयोगकर्ता को एक कस्टम संदेश के साथ संकेत देने के लिए, -p . का उपयोग करें झंडा।

read -p "Enter your age" variable_name

उदाहरण:

#!/bin/bash

echo "Enter a numner"
read a

echo "Enter a numner"
read b

var=$((a+b))
echo $var
शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

संख्यात्मक तुलना तार्किक ऑपरेटर

तुलना का उपयोग यह जांचने के लिए किया जाता है कि क्या कथन true . का मूल्यांकन करते हैं या false . हम दो कथनों की तुलना करने के लिए नीचे दिखाए गए ऑपरेटरों का उपयोग कर सकते हैं:

<थ>वाक्यविन्यास
ऑपरेशन स्पष्टीकरण
समानता num1 -eq num2 num1 num2 के बराबर है
बराबर से बड़ा num1 -ge num2 num1 के बराबर num2 से बड़ा है
इससे बड़ा num1 -gt num2 num2 से num1 बड़ा है
बराबर से कम num1 -le num2 num1, num2 के बराबर से कम है
इससे कम num1 -lt num2 num1 num2 से कम है
बराबर नहीं num1 -ne num2 संख्या1 है जो num2 के बराबर नहीं है

वाक्यविन्यास :

if [ conditions ]
    then
         commands
fi

उदाहरण :

आइए दो संख्याओं की तुलना करें और उनका संबंध खोजें:

read x
read y

if [ $x -gt $y ]
then
echo X is greater than Y
elif [ $x -lt $y ]
then
echo X is less than Y
elif [ $x -eq $y ]
then
echo X is equal to Y
fi

आउटपुट:

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

सशर्त विवरण (निर्णय लेना)

शर्तें वे भाव हैं जो एक बूलियन अभिव्यक्ति का मूल्यांकन करते हैं (true या false ) शर्तों की जांच करने के लिए, हम if . का उपयोग कर सकते हैं , if-else , if-elif-else और नेस्टेड सशर्त।

सशर्त बयानों की संरचना इस प्रकार है:

  • if...then...fi बयान
  • if...then...else...fi बयान
  • if..elif..else..fi
  • if..then..else..if..then..fi..fi.. (नेस्टेड कंडीशनल)

वाक्यविन्यास :

if [[ condition ]]
then
	statement
elif [[ condition ]]; then
	statement 
else
	do this by default
fi

सार्थक तुलना करने के लिए, हम AND -a . का उपयोग कर सकते हैं और या -o साथ ही।

नीचे दिए गए कथन का अनुवाद इस प्रकार है:यदि a 40 से अधिक है और b 6 से कम है।

if [ $a -gt 40 -a $b -lt 6 ]

उदाहरण :आइए इसकी भुजाओं की लंबाई पढ़कर त्रिभुज के प्रकार का पता लगाएं।

read a
read b
read c

if [ $a == $b -a $b == $c -a $a == $c ]
then
echo EQUILATERAL

elif [ $a == $b -o $b == $c -o $a == $c ]
then 
echo ISOSCELES
else
echo SCALENE

fi

आउटपुट :

टेस्ट केस #1

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

टेस्ट केस #2

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

टेस्ट केस #3

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

लूपिंग और स्किपिंग

लूप के लिए आप एक विशिष्ट संख्या में बार-बार स्टेटमेंट निष्पादित कर सकते हैं।

संख्याओं के साथ लूपिंग:

नीचे दिए गए उदाहरण में, लूप 5 बार पुनरावृति करेगा।

#!/bin/bash

for i in {1..5}
do
    echo $i
done
शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

स्ट्रिंग्स के साथ लूपिंग:

हम स्ट्रिंग्स के माध्यम से भी लूप कर सकते हैं।

#!/bin/bash

for X in cyan magenta yellow  
do
	echo $X
done
शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

लूप के दौरान

जबकि लूप कंडीशन की जांच करते हैं और तब तक लूप करते हैं जब तक कि कंडीशन true रहती है . हमें एक काउंटर स्टेटमेंट प्रदान करने की आवश्यकता है जो लूप निष्पादन को नियंत्रित करने के लिए काउंटर को बढ़ाता है।

नीचे दिए गए उदाहरण में, (( i += 1 )) काउंटर स्टेटमेंट है जो i . के मान को बढ़ाता है ।

उदाहरण:

#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done
शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

फ़ाइलें पढ़ना

मान लीजिए हमारे पास एक फ़ाइल है sample_file.txt जैसा कि नीचे दिखाया गया है:

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

हम फाइल लाइन को लाइन से पढ़ सकते हैं और आउटपुट को स्क्रीन पर प्रिंट कर सकते हैं।

#!/bin/bash

LINE=1

while read -r CURRENT_LINE
	do
		echo "$LINE: $CURRENT_LINE"
    ((LINE++))
done < "sample_file.txt"

आउटपुट:

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

बैक टिक के साथ कमांड कैसे निष्पादित करें

यदि आपको अपनी स्क्रिप्ट में एक जटिल कमांड के आउटपुट को शामिल करने की आवश्यकता है, तो आप बैक टिक के अंदर स्टेटमेंट लिख सकते हैं।

सिंटैक्स:

var=` commands `

उदाहरण :मान लीजिए हम tmpfs . के साथ माउंटपॉइंट की सूची का आउटपुट प्राप्त करना चाहते हैं उनके नाम पर। हम इस तरह से एक स्टेटमेंट तैयार कर सकते हैं:df -h | grep tmpfs

इसे बैश स्क्रिप्ट में शामिल करने के लिए, हम इसे बैक टिक में संलग्न कर सकते हैं।

#!/bin/bash

var=`df -h | grep tmpfs`
echo $var

आउटपुट:

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

कमांड लाइन से स्क्रिप्ट के लिए तर्क कैसे प्राप्त करें

निष्पादन पर स्क्रिप्ट को तर्क देना संभव है।

$@ एक से शुरू होने वाले मापदंडों की स्थिति का प्रतिनिधित्व करता है।

#!/bin/bash

for x in $@
do
    echo "Entered arg is $x"
done

इसे इस तरह चलाएं:

./script arg1 arg2

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

क्रॉन जॉब्स द्वारा शेड्यूलिंग द्वारा स्क्रिप्ट को स्वचालित कैसे करें

क्रोन एक जॉब शेड्यूलिंग यूटिलिटी है जो यूनिक्स जैसे सिस्टम में मौजूद है। आप दैनिक, साप्ताहिक, मासिक या दिन के किसी विशिष्ट समय में निष्पादित करने के लिए कार्य शेड्यूल कर सकते हैं। Linux में ऑटोमेशन काफी हद तक क्रॉन जॉब्स पर निर्भर करता है।

क्रॉन्स शेड्यूल करने का सिंटैक्स नीचे दिया गया है:

# Cron job example
* * * * * sh /path/to/script.sh

यहां, * प्रतिनिधित्व मिनट (ओं) घंटे (दिनों) दिन (महीने) कार्यदिवसों को क्रमशः दर्शाता है।

क्रॉन जॉब शेड्यूल करने के कुछ उदाहरण नीचे दिए गए हैं।

अनुसूची अनुसूचित मान
5 0 * 8 * अगस्त में 00:05 बजे।
5 4 * * 6 रविवार को 04:05 बजे।
0 22 * ​​* 1-5 सोमवार से शुक्रवार तक सप्ताह के प्रत्येक दिन 22:00 बजे।

आप इस ब्लॉग पोस्ट में क्रॉन के बारे में विस्तार से जान सकते हैं।

सिस्टम में मौजूदा स्क्रिप्ट की जांच कैसे करें

क्रोंटैब का उपयोग करना

crontab -l किसी विशेष उपयोगकर्ता के लिए पहले से निर्धारित स्क्रिप्ट को सूचीबद्ध करता है।

शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

ढूंढें कमांड का उपयोग करना

find कमांड कुछ पैटर्न के आधार पर फाइलों का पता लगाने में मदद करता है। चूंकि अधिकांश स्क्रिप्ट .sh . के साथ समाप्त होती हैं , हम इस तरह से खोज स्क्रिप्ट का उपयोग कर सकते हैं:

find . -type f -name "*.sh"

कहां,

  • . वर्तमान निर्देशिका का प्रतिनिधित्व करता है। आप तदनुसार रास्ता बदल सकते हैं।
  • -type f इंगित करता है कि जिस फ़ाइल प्रकार की हम तलाश कर रहे हैं वह एक टेक्स्ट आधारित फ़ाइल है।
  • *.sh .sh . के साथ समाप्त होने वाली सभी फाइलों से मेल खाने के लिए कहता है ।
शुरुआती के लिए शैल स्क्रिप्टिंग - लिनक्स में बैश स्क्रिप्ट कैसे लिखें

यदि आप खोज कमांड के बारे में विस्तार से पढ़ना चाहते हैं, तो मेरी अन्य पोस्ट देखें।

रैप-अप करना

इस ट्यूटोरियल में हमने शेल स्क्रिप्टिंग की मूल बातें सीखीं। हमने उदाहरणों और वाक्य-विन्यास पर ध्यान दिया जो हमें सार्थक कार्यक्रम लिखने में मदद कर सकते हैं।

इस ट्यूटोरियल से आपने अपनी पसंदीदा चीज़ क्या सीखी? मुझे ट्विटर पर बताएं!

आप मेरी अन्य पोस्ट यहाँ पढ़ सकते हैं।

मैक्रोवेक्टर द्वारा बनाया गया वर्क वेक्टर - www.freepik.com


  1. लिनक्स में प्रभावी बैश स्क्रिप्ट लिखने के लिए 10 उपयोगी टिप्स

    शेल स्क्रिप्टिंग प्रोग्रामिंग का सबसे आसान रूप है जिसे आप लिनक्स में सीख सकते हैं/कर सकते हैं। इसके अलावा, यह सिस्टम प्रशासन के लिए कार्यों को स्वचालित करने, नई सरल उपयोगिताओं/उपकरणों को विकसित करने के लिए एक आवश्यक कौशल है, लेकिन कुछ का उल्लेख करने के लिए। इस लेख में, हम प्रभावी और विश्वसनीय बैश स

  1. विंडोज 10 [ट्यूटोरियल] पर बैश (लिनक्स शेल) को कैसे स्थापित और उपयोग करें

    यहां बताया गया है कि विंडोज़ पर लिनक्स शेल को कैसे सेट अप करें और उसका उपयोग कैसे करें - लिनक्स के लिए विंडोज सबसिस्टम का उपयोग करके (WSL )। यह ट्यूटोरियल 2020 से विंडोज 10 के अप-टू-डेट वर्जन के लिए है। मैं विंडोज 10 के पुराने संस्करणों या विंडोज 8/7/XP/3.1 के अन्य तरीकों पर WSL का उपयोग करने के त

  1. विंडोज 10 पर लिनक्स बैश शेल कैसे स्थापित करें

    बैश शेल केवल एक कमांड-लाइन उपयोगिता है जो बहुत लंबे समय से लिनक्स का हिस्सा रही है और अब, माइक्रोसॉफ्ट ने इसे सीधे विंडोज 10 में जोड़ा है। यह न तो वर्चुअल मशीन है और न ही कोई कंटेनर या विंडोज के लिए संकलित कोई सॉफ्टवेयर। इसके बजाय, यह विंडोज़ पर एंड्रॉइड ऐप चलाने के लिए माइक्रोसॉफ्ट के बंद प्रोजेक्ट