ফাইলের পথ দেওয়ার সময় কেন আমি '/ home / ব্যবহারকারীর নাম /' এর পরিবর্তে '~' ব্যবহার করতে পারি না


43

উদাহরণস্বরূপ, কোনও ফাইল আনজিপ করার সময় আমি কোনও ফাইলের পথে নির্দেশ করার ~পরিবর্তে ব্যবহার করতে পারি ।/home/username/.zip

যাইহোক, আজ যখন আমি টার্মিনালে একটি আরএনএন উদাহরণ চালানোর জন্য একইভাবে অনুসরণ করেছি, tensorflow.python.framework.errors_impl.NotFoundErrorতখন ছুড়ে দেওয়া হয়েছিল।

$ python ptb_word_lm.py --data_path=~/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/simple-examples/data/ --model=small 
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally
Traceback (most recent call last):
  File "ptb_word_lm.py", line 374, in <module>
    tf.app.run()
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/python/platform/app.py", line 44, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "ptb_word_lm.py", line 321, in main
    raw_data = reader.ptb_raw_data(FLAGS.data_path)
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/ptb/reader.py", line 73, in ptb_raw_data
    word_to_id = _build_vocab(train_path)
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/ptb/reader.py", line 34, in _build_vocab
    data = _read_words(filename)
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/ptb/reader.py", line 30, in _read_words
    return f.read().decode("utf-8").replace("\n", "<eos>").split()
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/python/lib/io/file_io.py", line 106, in read
    self._preread_check()
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/python/lib/io/file_io.py", line 73, in _preread_check
    compat.as_bytes(self.__name), 1024 * 512, status)
  File "/home/hok/anaconda2/lib/python2.7/contextlib.py", line 24, in __exit__
    self.gen.next()
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/errors_impl.py", line 469, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.NotFoundError: ~/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/simple-examples/data/ptb.train.txt

তারপর আমি প্রতিস্থাপিত ~সঙ্গে /home/username/, এবং এটি সঠিকভাবে কাজ করেন।

আরএনএন উদাহরণ চালানোর সময় কেন আমি ফাইলের পথে নির্দেশ করার ~পরিবর্তে ব্যবহার করতে পারি না /home/username/?

আপনি আমাকে বিস্তারিত বলতে পারেন?




@ অস্কারস্কোগ যুক্তিটি অজগরকে দেওয়ার ~আগে শেলটি কি প্রসারিত হওয়া উচিত নয় ? শেলটি যেমন পথের পিছনে ছড়িয়ে পড়ে, বা পথটি উদ্ধৃত হয় তা উদ্ধৃত করে দেয় like
মিশেল জনসন

1
বিপরীতে $VARIABLES, ~কেবল একটি স্ট্রিংয়ের শুরুতে প্রসারিত হয়।
অ্যালেক্সিস

@ অস্কারস্কোগ, "পাইথন" এর অর্থ কী তা জানে না "বোঝায় যে কোনও সমস্যা পাইথনের সাথে নির্দিষ্ট কিছু কার্যকারিতা নেই, একটি অযৌক্তিক প্রত্যাশা স্থাপন করে যে এই জাতীয় কার্যকারিতা ( 'ডি হওয়ার পরে সম্প্রসারণ সম্পাদন করা exec) ইউনিক্স সরঞ্জামগুলিতে বিস্তৃতভাবে পাওয়া উচিত
চার্লস ডাফি

উত্তর:


45

আপনার বুঝতে হবে ~এটি সাধারণত শেল দ্বারা প্রসারিত হয়; আপনি যে প্রোগ্রামগুলি কল করেন তা কখনই তা দেখতে পায় না, তারা ব্যাশ দ্বারা inোকানো পুরো পথের নামটি দেখে। তবে এটি তখনই ঘটে যখন টিল্ডটি একটি আর্গুমেন্টের শুরুতে হয় (এবং উদ্ধৃত হয় না)।

আপনি যে পাইথন প্রোগ্রামটি চালাচ্ছেন যদি getoptএটির কমান্ডলাইনটি পার্স করার মতো মডিউল ব্যবহার করে তবে --data-pathটিল্ড সম্প্রসারণের জন্য পৃথক "শব্দ" হিসাবে বিকল্পটির যুক্তি দিতে পারেন :

$ python ptb_word_lm.py --data_path ~/anaconda2/lib/python2.7/...

আপনার নিজের কোডে, আপনি ব্যবহার করতে পারেন getoptবা argparseতর্ক করার প্রক্রিয়াজাতকরণের জন্য এবং @ জ্যাকবভিলিজমের উত্তর প্রস্তাবিতভাবে ম্যানুয়ালি টিल्डসও প্রসারিত করতে পারেন।

গীত। টিল্ড একটি শুরুতে সম্প্রসারিত হয় শেল মত পরিবর্তনশীল নিয়োগ অভিব্যক্তি DIRNAME=~/anaconda2; যদিও আপনার প্রশ্নের টিল্ডটিও সমান চিহ্নকে অনুসরণ করে, এই ব্যবহারটি শেলের জন্য বিশেষ অর্থ রাখে না (এটি কেবল কোনও প্রোগ্রামে পাস করা কিছু) এবং প্রসারণকে ট্রিগার করে না।


6
আপনি ইতিমধ্যে জানেন না যদি আপনি পাইথন লিখছেন তবে getoptব্যবহার করুন argparse
নিক টি

আমি উত্তরটিতে যুক্ত করেছি argparseযেহেতু এটি মূল বিকল্প, তবে ব্যক্তিগতভাবে আমি এটি ব্যবহার করা আরও getoptসহজ, সহজ নয় বলে মনে করি। YMMV।
অ্যালেক্সিস

33

পাইথনে টিলডে সম্প্রসারণ

উত্তরটি সংক্ষিপ্ত এবং সহজ:

~আপনি ব্যবহার না করা হলে অজগর প্রসারিত হবে না:

import os
os.path.expanduser('~/your_directory')

এখানেও দেখুন :

os.path.expanduser (পাথ)
ইউনিক্স এবং উইন্ডোজে, user বা ~ ব্যবহারকারীর হোম ডিরেক্টরি দ্বারা প্রতিস্থাপিত একটি প্রাথমিক উপাদান দিয়ে যুক্তিটি ফিরিয়ে দিন।

ইউনিক্সে, একটি প্রাথমিক ~ পরিবেশের ভেরিয়েবল হোম দ্বারা সেট করা থাকলে প্রতিস্থাপন করা হয়; অন্যথায় বর্তমান ব্যবহারকারীর হোম ডিরেক্টরিটি বিল্ট-ইন মডিউল পিডাব্লুডির মাধ্যমে পাসওয়ার্ড ডিরেক্টরিতে সন্ধান করা হবে। একটি প্রাথমিক ~ ব্যবহারকারীকে সরাসরি পাসওয়ার্ড ডিরেক্টরিতে দেখানো হয়।


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

1
আমি মনে করি অধিকতর প্রাসঙ্গিক বিষয়টি অ্যালেক্সিসের উত্তরে রেখাযুক্ত করা হয়েছে: ~শেল আর্গুমেন্ট তালিকার অবস্থান ।
ডেভিড ফোস্টার 12

@ ফার্সিল, আমি একমত নই প্রোগ্রামগুলি পোর্টেবল করা যায়, তবে আপনি যখন এগুলি কমান্ড লাইন থেকে চালান, আপনি এটি একটি নির্দিষ্ট সিস্টেমে করেন। এবং আসুন না ভুলে যাবেন না যে এই askubuntu.com, এবং উবুন্টু সবসময় ইউনিক্স আছে (দিন আমরা জানি যতদূর :-)
Alexis

1
@ অ্যালেক্সিস: উবুন্টু ওএস স্তরে টিলডে সম্প্রসারণও করে না। এটি এখনও শেল কার্যকারিতা।
ব্যবহারকারী 2357112

1
আপনি চুল বিভক্ত করছেন এমন পদ্ধতিগুলি। কেউ বলেনি কার্নেল এটি করছে। মুল বক্তব্যটি হ'ল এটি প্রোগ্রাম দ্বারা করা হয়নি যা আর্গুমেন্ট গ্রহণ করে।
অ্যালেক্সিস

12

টিলডে সম্প্রসারণ কেবল কয়েকটি প্রসঙ্গে করা হয় যা শেলের মধ্যে সামান্য পরিবর্তিত হয়

এটি এতে সঞ্চালিত হওয়ার সময়:

var=~

অথবা

export var=~

কিছু শেল মধ্যে। এটা ভিতরে না

echo var=~
env var=~ cmd
./configure --prefix=~

পসিক্স শাঁসে

এটি bashপজিক্স কনফারেন্স মোডে না থাকলেও (যেমন যখন ডাকা হয় sh, বা কখন POSIXLY_CORRECTপরিবেশে থাকে):

$ bash -c 'echo a=~'
a=/home/stephane
$ POSIXLY_CORRECT= bash -c 'echo a=~'
a=~
$ SHELLOPTS=posix bash -c 'echo a=~'
a=~
$ (exec -a sh bash -c 'echo a=~')
a=~

তবে কেবল তখনই যখন বামদিকে থাকে তার =অকার্যকর বৈকল্পিক নামের মতো আকৃতি তৈরি করা হয়, সুতরাং এটি যখন প্রসারিত হবে তখন এটি ( কোনও বৈধ ভেরিয়েবলের নাম নয়) বা (উক্ত উদ্ধৃতির কারণে ) তেও cmd prefix=~হবে না এবং মধ্যে ।cmd --prefix=~--prefixcmd "p"refix=~pvar=prefix; cmd $var=~

ইন zsh, আপনি যে কোনও শর্ত ছাড়াই পরে প্রসারিত করার magic_equal_substজন্য বিকল্পটি সেট করতে পারেন ।~=

$ zsh -c 'echo a=~'
a=~
$ zsh -o magic_equal_subst -c 'echo a=~'
a=/home/stephane
$ zsh -o magic_equal_subst -c 'echo --a=~'
--a=/home/stephane

ক্ষেত্রে ~(যেমন বিরোধিতা ~user), আপনি শুধু ব্যবহার করতে পারেন $HOMEপরিবর্তে:

cmd --whatever="$HOME/whatever"

~এর মান পর্যন্ত প্রসারিত হয় $HOME। যদি $HOMEসেট না করা থাকে তবে শেলগুলির মধ্যে আচরণের পরিমাণে পরিবর্তিত হয়। কিছু শেল ব্যবহারকারী ডাটাবেসকে জিজ্ঞাসা করে। আপনি যদি তা বিবেচনায় নিতে চান তবে আপনি করতে পারেন (এবং এটির জন্য আপনাকে কী করতে হবে ~user):

dir=~ # or dir=~user
cmd --whatever="$dir/whatever"

যাই হোক না কেন, শেল ছাড়াও zshমনে রাখবেন আপনার পরিবর্তনশীল বিস্তৃতি উদ্ধৃত করতে হবে!


1
বাশের রেফারেন্স ম্যানুয়াল বলে মনে হচ্ছে যে টিল্ডগুলি কেবল পরিবর্তনশীল কার্যভারে এবং একটি শব্দের শুরুতে প্রসারিত হয়, সুতরাং এটির echo a=~প্রসারটি ম্যানুয়ালটির বিরোধিতা বলে মনে হয়।
ইল্কাচ্চু

@ ইলক্কাছু, হ্যাঁ ম্যানুয়ালটি অসম্পূর্ণ। কোন প্রসঙ্গে ~প্রসারিত হবে ("শব্দ" দ্বারা বোঝানো হয়েছে) তাও পরিষ্কারভাবে নির্দিষ্ট করে দেয় না । আরও তথ্যের জন্য উত্তরের উপরের লিঙ্কটি দেখুন।
স্টাফেন চেজেলাস

6

~নির্দিষ্ট প্রসার বিধি রয়েছে, যা আপনার আদেশটি সন্তুষ্ট করে না। বিশেষত, শব্দের (উদাঃ python ~/script.py) শুরুতে বা ভেরিয়েবল অ্যাসাইনমেন্ট (উদাঃ PYTHONPATH=~/scripts python script.py) এর শুরুর দিকেই যখন উদ্ধৃত হয় কেবল তখনই এটি প্রসারিত হয় । আপনার কাছে --data_path=~/blablaযা শেল পদে একক শব্দ, তাই সম্প্রসারণ করা হয় না।

তাত্ক্ষণিক সংশোধন হ'ল $HOMEশেল ভেরিয়েবল ব্যবহার করা , যা নিয়মিত পরিবর্তনশীল প্রসারণের নিয়ম অনুসরণ করে:

python ptb_word_lm.py --data_path=$HOME/blabla

এটি কিছুটা প্রশংসিত হয়েছে, অন্যান্য প্রসঙ্গে রয়েছে টিলডে সম্প্রসারণ যেমন করা হয়েছিল PATH=$PATH:~/bin। এছাড়াও $HOMEএটিকে উদ্ধৃত করা বা বিভক্ত করা প্রয়োজন + গ্লোব ব্যতীত অন্য শেলগুলিতে প্রযোজ্য zsh
স্টাফেন চেজেলাস

@ এসসি দুঃখিত, তবে আপনি যে মন্তব্যে এই লিঙ্কটি সরবরাহ করেছেন তাতে তিল্ডের সম্প্রসারণের কোনও উল্লেখ না করে অপটিক্যাল মাউস সম্পর্কে একটি প্রশ্ন দেখা দেয়। আপনি দয়া করে এটি ব্যাখ্যা করতে পারেন?
সের্গেই কলডিয়াজন্য

ভাল উত্তর. এটি বিভাগে bashম্যানুয়ালটি মূলত কিসের সংক্ষিপ্ত বিবরণ দেয় Tilde Expansion। +1
সের্গেই কলডিয়াজনি

দুঃখিত, আমি ইউনিক্স.এসইতে অন্তর্-সাইট লিঙ্কগুলি ব্যবহার করতে এতটাই অভ্যস্ত হয়েছি [link](/a/146697)যে আমি বুঝতে পারি না যে আমরা এখানে অন্য কোনও সাইটে আছি। লিঙ্কটি সেখানেই
স্টাফেন চাজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.