Inilah masalahnya: Saya memiliki skrip ini foo.py
, dan jika pengguna memintanya tanpa opsi --bar
, saya ingin menampilkan pesan kesalahan berikut:
Please add the --bar option to your command, like so:
python foo.py --bar
Sekarang, bagian tersulitnya adalah ada beberapa cara pengguna menjalankan perintah:
- Mereka mungkin menggunakan
python foo.py
seperti pada contoh - Mereka mungkin telah menggunakan
/usr/bin/foo.py
- Mereka mungkin memiliki alias shell
frob='python foo.py'
, dan sebenarnya menjalankanfrob
- Mungkin itu bahkan git alias
flab=!/usr/bin/foo.py
, dan mereka menggunakangit flab
Dalam setiap kasus, saya ingin pesan mencerminkan bagaimana pengguna menjalankan perintah, sehingga contoh yang saya berikan masuk akal.
sys.argv
selalu berisi foo.py
, dan /proc/$$/cmdline
tidak mengenal alias. Tampaknya bagi saya satu-satunya sumber informasi ini adalah bash itu sendiri, tetapi saya tidak tahu bagaimana cara menanyakannya.
Ada ide?
PEMBARUAN Bagaimana jika kita membatasi kemungkinan skenario hanya pada skenario yang tercantum di atas?
PEMBARUAN 2: Banyak orang menulis penjelasan yang sangat bagus tentang mengapa hal ini tidak mungkin dilakukan dalam kasus umum, jadi saya ingin membatasi pertanyaan saya pada ini:
Dengan asumsi berikut:
- Script dimulai secara interaktif, dari bash
- The script was start in one of these 3 ways:
foo <args>
where foo is a symbolic link /usr/bin/foo -> foo.pygit foo
di mana alias.foo=!/usr/bin/foo di~/.gitconfig
git baz
di mana alias.baz=!/usr/bin/foo di~/.gitconfig
Apakah ada cara untuk membedakan antara 1 dan (2,3) dari dalam skrip? Apakah ada cara untuk membedakan antara 2 dan 3 dari dalam skrip?
Saya tahu ini masih jauh, jadi saya menerima jawaban Charles Duffy untuk saat ini.
PEMBARUAN 3: Sejauh ini, sudut pandang yang paling menjanjikan dikemukakan oleh Charles Duffy dalam komentar di bawah. Jika saya bisa membuat pengguna saya memilikinya
trap 'export LAST_BASH_COMMAND=$(history 1)' DEBUG
di .bashrc
mereka, maka saya dapat menggunakan sesuatu seperti ini di kode saya:
like_so = None
cmd = os.environ['LAST_BASH_COMMAND']
if cmd is not None:
cmd = cmd[8:] # Remove the history counter
if cmd.startswith("foo "):
like_so = "foo --bar " + cmd[4:]
elif cmd.startswith(r"git foo "):
like_so = "git foo --bar " + cmd[8:]
elif cmd.startswith(r"git baz "):
like_so = "git baz --bar " + cmd[8:]
if like_so is not None:
print("Please add the --bar option to your command, like so:")
print(" " + like_so)
else:
print("Please add the --bar option to your command.")
Dengan cara ini, saya menampilkan pesan umum jika saya tidak berhasil mendapatkan metode pemanggilannya. Tentu saja, jika saya akan mengandalkan perubahan lingkungan pengguna saya, saya mungkin juga memastikan bahwa berbagai alias mengekspor variabel lingkungan mereka sendiri yang dapat saya lihat, tapi setidaknya cara ini memungkinkan saya untuk menggunakan teknik yang sama untuk semua variabel lingkungan. skrip lain yang mungkin saya tambahkan nanti.
history 1
sudah cukup? - person Aaron   schedule 12.07.2018--bar
wajib, bagaimana kalau selalu menambahkannya sendiri secara internal, dan memberikan--no-bar
untuk pengguna yang lebih mahir yang tidak menginginkannya dan tahu cara menambahkan argumen? - person Mark Setchell   schedule 12.07.2018git rebase
mengalami konflik. Jadi idemu tidak akan berhasil untukku. - person itsadok   schedule 12.07.2018Please add the --bar option to your command, like so: 'cmd --bar'
Kebanyakan orang cukup pintar (sekali lagi, IMHO) untuk mengetahui bahwacmd
adalah isian untuk apa pun yang mereka ketik. - person dawg   schedule 18.07.2018BASH_COMMAND
ke lingkungan dari jebakanDEBUG
, namun jika Anda mengandalkannya, program Anda hanya akan memiliki perilaku tersebut ketika dipanggil oleh a cangkangnya sudah disiapkan... jadi sepertinya tidak berguna. - person Charles Duffy   schedule 19.07.2018git
, ya, Anda dapat melakukannya. Alias Shell tidak ditemukan di mana pun dalam riwayat, tetapi karena pemanggilan alias git melalui perintah eksternal yang sebenarnya, alias tersebut akan muncul. - person Charles Duffy   schedule 19.07.2018argv[0]
berfungsi untuk mereka, dimediasi melalui/proc/self/cmdline
atau sebaliknya). - person Charles Duffy   schedule 19.07.2018