আপনি যদি ব্যবহার করেন তবে strace
দেখতে পাবেন শেল স্ক্রিপ্টটি চালিত হওয়ার পরে কীভাবে কার্যকর করা হয়।
উদাহরণ
বলুন আমার কাছে এই শেল স্ক্রিপ্ট রয়েছে।
$ cat hello_ul.bash
#!/bin/bash
echo "Hello Unix & Linux!"
এটি ব্যবহার করে চালানো strace
:
$ strace -s 2000 -o strace.log ./hello_ul.bash
Hello Unix & Linux!
$
strace.log
ফাইলটির ভিতরে এক নজরে নিলে নিম্নলিখিত বিষয়গুলি প্রকাশিত হয়।
...
open("./hello_ul.bash", O_RDONLY) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff0b6e3330) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
read(3, "#!/bin/bash\n\necho \"Hello Unix & Linux!\"\n", 80) = 40
lseek(3, 0, SEEK_SET) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
fcntl(255, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 255) = 255
close(3)
...
একবার ফাইলটি পড়ার পরে এটি কার্যকর করা হয়:
...
read(255, "#!/bin/bash\n\necho \"Hello Unix & Linux!\"\n", 40) = 40
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 3), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc0b38ba000
write(1, "Hello Unix & Linux!\n", 20) = 20
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(255, "", 40) = 0
exit_group(0) = ?
উপরের অংশে আমরা পরিষ্কারভাবে দেখতে পারি যে পুরো লিপিটি একক সত্তা হিসাবে পাঠ করা হয়েছে এবং তারপরে সেখানে সম্পাদন করা হয়েছে uted সুতরাং এটি কমপক্ষে বাশের ক্ষেত্রে "উপস্থিত" হবে যে এটি ফাইলটি পড়ে এবং তারপরে এটি কার্যকর করে। সুতরাং আপনি কি ভাবছেন যে স্ক্রিপ্টটি চলাকালীন সম্পাদনা করতে পারবেন?
দ্রষ্টব্য: যদিও না! চলমান স্ক্রিপ্ট ফাইলের সাথে কেন আপনার গোলযোগ করা উচিত তা বুঝতে পড়ুন।
অন্যান্য দোভাষী সম্পর্কে কি?
তবে আপনার প্রশ্নটি কিছুটা বন্ধ। এটি লিনাক্স নয় যে অগত্যা ফাইলটির বিষয়বস্তু লোড করা উচিত, এটি অনুবাদকরা যে বিষয়বস্তুগুলি লোড করে চলেছে, তাই অনুবাদক কীভাবে এটি প্রয়োগ করেছিলেন যে এটি একবারে ফাইলটি সম্পূর্ণরূপে বা ব্লক বা লাইনে লোড করে কিনা to
তাহলে আমরা ফাইলটি সম্পাদনা করতে পারি না কেন?
আপনি যদি আরও বড় স্ক্রিপ্ট ব্যবহার করেন তবে আপনি লক্ষ্য করবেন যে উপরের পরীক্ষাটি কিছুটা বিভ্রান্তিকর। আসলে বেশিরভাগ দোভাষী তাদের ফাইলগুলি ব্লকে লোড করে। এটি অনেকগুলি ইউনিক্স সরঞ্জামের সাথে স্ট্যান্ডার্ড যেখানে তারা কোনও ফাইলের ব্লক লোড করে, প্রক্রিয়াজাত করে এবং অন্য একটি ব্লক লোড করে। grep
শিরোনাম: আমি এই U&L প্রশ্নোত্তরের সাথে এই আচরণটি দেখতে পাচ্ছি যে শিরোনামটি সম্পর্কে: গ্রিপ / এগ্রিপ প্রতিটি বার কত পাঠ্য ব্যবহার করে? ।
উদাহরণ
বলুন আমরা নীচের শেল স্ক্রিপ্টটি তৈরি করি।
$ (
echo '#!/bin/bash';
for i in {1..100000}; do printf "%s\n" "echo \"$i\""; done
) > ascript.bash;
$ chmod +x ascript.bash
এই ফাইলে ফলাফল:
$ ll ascript.bash
-rwxrwxr-x. 1 saml saml 1288907 Mar 23 18:59 ascript.bash
যার মধ্যে নিম্নলিখিত ধরণের সামগ্রী রয়েছে:
$ head -3 ascript.bash ; echo "..."; tail -3 ascript.bash
#!/bin/bash
echo "1"
echo "2"
...
echo "99998"
echo "99999"
echo "100000"
এখন আপনি যখন উপরের একই কৌশলটি ব্যবহার করে এটি চালান strace
:
$ strace -s 2000 -o strace_ascript.log ./ascript.bash
...
read(255, "#!/bin/bash\necho \"1\"\necho \"2\"\necho \"3\"\necho \"4\"\necho \"5\"\necho \"6\"\necho \"7\"\necho \"8\"\necho \"9\"\necho \"10\"\necho
...
...
\"181\"\necho \"182\"\necho \"183\"\necho \"184\"\necho \"185\"\necho \"186\"\necho \"187\"\necho \"188\"\necho \"189\"\necho \"190\"\necho \""..., 8192) = 8192
আপনি দেখতে পাবেন যে ফাইলটি 8KB ইনক্রিমেন্টে পড়ছে, সুতরাং বাশ এবং অন্যান্য শেলগুলি সম্ভবত কোনও ফাইল পুরোপুরি লোড করবে না, বরং তারা এগুলি ব্লকগুলিতে পড়ে।
তথ্যসূত্র