বাশে সম্ভাব্য বাগ ?: foo () - প্রতিধ্বনি "$ {var [0]}"; }; var = (বার বাজ) foo


22

ওএস : উবুন্টু 16.04.3

শেল : 4.3.48 বাশ


আমি জানি যে সাময়িকভাবে কোনও ভেরিয়েবলের বিষয়বস্তু হিসাবে সাময়িকভাবে পরিবর্তন করা সম্ভব var=value command, এটি সম্ভবত IFS= read -r varএটির উল্লেখযোগ্য কেস।

এবং, গ্রেগের উইকের ধন্যবাদ , আমিও বুঝতে পেরেছি:

# Why this
foo() { echo "$var"; }
var=value foo

# And this does work
var=value; echo "$var"

# But this doesn't
var=value echo "$var"

আমার বোধগম্যতা থেকে রক্ষা পাওয়ার বিষয়টি হ'ল:

$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)

আমি যতদূর জানি (এবং পূর্ববর্তী উদাহরণগুলির যুক্তি অনুসরণ করে) এটি মুদ্রণ করা উচিত bar, নয় (bar baz)

এটা কি কেবল আমার সাথে ঘটে? এটা কি উদ্দেশ্যমূলক আচরণ এবং আমি কিছু মিস করছি? অথবা এই একটি বাগ সংশোধন করা হয়?


3
সম্ভবত বাশ পরিবেশগত পরিবর্তনশীল হিসাবে অ্যারে সমর্থন করে না এই সত্যটির সাথে কিছু করার আছে?
জেসি_বি

3
@ জেসি_বি সম্ভবত যদিও আমি export var=(foo bar); echo "${var[0]}"এটি প্রিন্ট চালানোর সময় fooনা (foo bar)
nxnev

1
অদ্ভুত, এটি আমার জন্যও কাজ করেছিল। এবং exportএটি ব্যবহার করে দেখায়:declare -ax var=([0]="foo" [1]="bar")
জেসি_বি

3
পরিবেশে অ্যারে থাকতে পারে না, এএফাইক। যেমন, export i_am_array=(foo bar); /usr/bin/env | grep i_am_arrayএখানে কোনও আউটপুট দেয় না।
ডার্বোবার্ট

3
এছাড়াও: এটির একটি স্ট্রিং হিসাবে বিবেচিত হওয়ার বিষয়টি নিশ্চিত করে foo() { declare -p var; } ; var=(bar baz) fooদেয় declare -x var="(bar baz)", অ্যারে নয়
ডার্বার্ট

উত্তর:


19

সাধারণত কল করা:

var=value cmd

যেখানে cmdএকটি ফাংশন পোর্টেবল হয় না।

এর সাথে bash, এটি কেবল স্কেলার ভেরিয়েবলগুলির জন্য কাজ করে (এবং x=(...)একটি অ্যারে হিসাবে পার্স করা থাকলে তবে একটি স্কেলার হিসাবে নির্ধারিত হয়) এবং স্কোপিংয়ের সাথে বেশ কয়েকটি সমস্যা রয়েছে যদি আপনি এটি করেন তবে, ksh93এবং yashএটি কাজ করে তবে পরিবর্তনশীল সংজ্ঞাটি পরে থেকেই যায়। এর সাথে mksh, আপনি একটি সিনট্যাক্স ত্রুটি পান। বোর্ন শেল-এ, এটি স্কেলার ভেরিয়েবলগুলির পক্ষে মোটেই কার্যকর হয়নি।

আরও মনে রাখবেন যে স্কেলার ভেরিয়েবলগুলি সহ, ভেরিয়েবলটি ফাংশনটির মধ্যে রফতানি করা শেষ হয়ে যায় (অর্থাত্ আদেশগুলি কার্যকর করা হয়) শেল থেকে শেলের মধ্যে পরিবর্তিত হয় (এটি বাশ, যশ, ম্যাক্স, জেডএস, তবে কেএসএসে নয়, ছাই)।

এটি কেবল আপনার সাথে প্রত্যাশা মতো কাজ করে zsh। নোট করুন যে zshঅ্যারে সূচকগুলি 1 থেকে শুরু হয়।

bash-4.4$ zsh
$ a=(before value)
$ f() echo $a[1]
$ a=(temp value) f
temp
$ echo $a[1]
before

12

এটি কেবল একটি ত্রুটি নয়, এটি এমন একটি অ-বাস্তবায়ন বৈশিষ্ট্য বলে মনে হয় যা এর আগে কখনও হওয়ার কোনও পরিকল্পনা নেই। ২০১৪ সালের এই মেইলিং তালিকা পোস্টটিতে এটি স্রষ্টার কাছ থেকে এসেছে:

ভাগ্যক্রমে, ব্যাশ 4.3 (প্যাচলেভেল 25) এ, আপনি কেবল -ড্যারায়_এক্সপোর্ট করতে পারবেন না এবং অ্যারে পরিবর্তনশীল আমদানি / রফতানি পেতে পারবেন। কোডটি সংকলন করে না, এবং আপনি যদি এটি ঠিক করেন তবে এটি লিঙ্ক করবে না এবং যদি আপনি এটি ঠিক করেন তবে ভাল, আপনি নীচের সমস্যাটি শেষ করবেন।

কেবল এটির জন্যই এটি এক টন ঝামেলা। অ্যারে এক্সপোর্ট সক্ষম করার জন্য আমার কোনও পরিকল্পনা নেই।

বাশের জন্য সর্বশেষতম গিট রেপো টানতে এটি রয়েছে variables.c:

  #  if ARRAY_EXPORT
        /* Array variables may not yet be exported. */

প্রস্তাব দেওয়া হচ্ছে যে যা আছে তা সম্পূর্ণ নয়।


5
এখানে, এটি কোনও ফাংশনের জন্য, সুতরাং কোনও execve()সিস্টেম কল জড়িত না থাকায় কোনও রফতানি করার প্রশ্নই আসে না । zshঅস্থায়ীভাবে সেভাবে সেট করা অ্যারের সাথে কলিং ফাংশনগুলিকে সমর্থন করে এমন একটি শেল দেখুন ।
স্টাফেন চেজেলাস

@ স্টাফেনচাজলাস তবে পরিবেশ পরিবর্তিত হয় (একটি নতুন ভেরিয়েবল যুক্ত করে) এবং তারপরে ফাংশনটি সমাপ্ত হওয়ার পরে ফিরে আসে (আমি এই মামলার বিষয়ে আছি my_var=one func_bar:)। আমরা কী বলতে পারি যে exportএটি পরিবেশের সাথে যুক্ত হচ্ছে এবং এভাবে রফতানি এখানে ব্যবহৃত হয়? আমার উত্তর দেখুন, আমি প্রদর্শন কোড যোগ।
মিনিম্যাক্স

10

থেকে man bashএর বাগ ধারা (সংস্করণ bash4.3 হয়):

বাগ

   Array variables may not (yet) be exported.

পরবর্তী কোডটি দেখায় যে পরিবেশে একটি অস্থায়ী পরিবর্তনশীল উপস্থিত থাকে তবে কেবল ফাংশনটি চলমান থাকে। ফাংশনটি শেষ হলে অস্থায়ী পরিবর্তনশীল অদৃশ্য হয়ে যায়।

### defining the "bar" function
### it pass all environment variables to the "grep" command
### and the "grep" prints the only "my_var" variable from it
bar() { env | grep my_var=; }

### calls the "bar" function with the temporary 
### variable "my_var" created and assigned.
my_var=one bar

my_var=one         ### The output. The environment contains the "my_var" variable

### checks, does the environment still have the "my_var" variable
### (It doesn't have.)
env | grep my_var=
                   ### The output is empty,
                   ### the environment doesn't contain the "my_var" variable

সংশ্লিষ্ট তথ্য:

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