Powershell: Cari tahu alias

Dibuat pada 28 Apr 2016  ·  64Komentar  ·  Sumber: PowerShell/PowerShell

Alias ​​PowerShell yang berkonflik dengan Linux dan OS X telah dihapus di # 786, secara khusus melakukan 7d9f43966.

Namun, diskusi baru sedang terjadi tentang cara menangani ini dengan lebih baik daripada hanya menghapus alias.

Issue-Discussion OS-Linux OS-macOS Resolution-Fixed Usability WG-DevEx-Portability

Komentar yang paling membantu

@ be5invis Ini bertentangan dengan cara kerja parameter di PowerShell. Mereka ortogonal, dan jika tidak, ada set parameter yang berbeda. Mereka juga hanya memiliki nama yang panjang dan alih-alih nama pendek mereka dapat disingkat secara individual selama mereka tetap tidak ambigu. Dalam kasus Anda, Anda juga perlu menambahkan alias ke parameter itu, fr . Juga tiba-tiba -Recurse tidak lagi dapat disingkat menjadi -r tetapi harus menjadi -re agar tidak bentrok dengan parameter -rf Anda usulkan.

Anda dapat mengajukan pertanyaan yang sama dari sisi lain: Mengapa tidak menentukan kedua parameter secara terpisah? Anda bersedia untuk melawan prinsip dan konvensi kode PowerShell dengan cara yang cukup besar hanya untuk terus berpura-pura Anda masih bekerja dengan alat Unix yang sama, meskipun sebenarnya tidak. Namun, konvensi parameter GNU dengan nama pendek dan panjangnya hampir tidak universal dan banyak alat yang sudah mapan menentangnya, misalnya tar , atau find . Namun Anda tidak siap untuk melacak bug mereka untuk mengubahnya. Sementara bagian inti dari Unix adalah selalu ada satu miliar program utilitas berbeda yang masing-masing bekerja dengan cara yang sedikit berbeda, tiba-tiba memiliki salah satu dari mereka (memang melakukan sedikit lebih banyak dan mencoba mencakup banyak utilitas lain itu sendiri) adalah begitu membingungkan dan bermasalah sehingga harus diubah? Saya rasa tidak.

Ingat: Cangkang pada mesin Anda adalah milik Anda. Sama seperti orang alias rm hingga rm -i untuk kenyamanan mereka sendiri, tidak ada yang menghalangi Anda untuk menghapus alias rm dan memiliki fungsi pembungkus Remove-Item disebut rm dengan parameter -rf .

Tetapi mencoba mengubah PowerShell secara keseluruhan untuk sepenuhnya mereplikasi setiap alat Unix cukup salah arah.

Semua 64 komentar

Ini membuat penggunaan rm , ls , dll. Menjadi sial, karena globbing tidak dilakukan:

> touch blah.tmp
> ls *.tmp                                                                                                          
ls: *.tmp: No such file or directory
> Get-ChildItem *.tmp

    Directory: /Users/andrew/src/PowerShell


Mode                LastWriteTime         Length Name                                                                                 
----                -------------         ------ ----                                                                                 
------           5/3/16   8:39 PM              0 blah.tmp

> rm *.tmp
rm: *.tmp: No such file or directory
> Remove-Item *.tmp
> Get-ChildItem *.tmp

Blah.

Sinkronisasi kegunaan umumnya setuju bahwa pengalaman interaktif menyebalkan tanpa alias. Apa yang tidak kami sepakati adalah alternatif apa yang harus ditawarkan kepada pengguna yang ingin menggunakan binari asli secara default. Beberapa opsi yang telah diapungkan meliputi:

  • Variabel lingkungan untuk menonaktifkan semua alias yang bertabrakan dengan biner * nix
  • Satu karakter (seperti ^ ) yang secara otomatis termasuk dalam PATH asli
  • Beri tahu orang-orang bahwa mereka harus bash -c (banyak yang mengatakan terlalu banyak karakter untuk dapat digunakan)
  • Beri tahu orang-orang bahwa mereka harus memberikan jalur lengkap (pengalaman ini secara teknis sudah berfungsi, tetapi sangat buruk)
  • Saran tambahan: Manfaatkan "hinting subsystem" untuk memberi tahu orang-orang bahwa mereka mungkin ingin menggunakan perintah native jika mereka menggunakan set parameter yang cocok dengan pola terhadap biner native * nix. Ini masih dapat bekerja hanya jika perintah gagal ( rm -e , misalnya, tidak akan gagal).

Saya pikir ini adalah sesuatu yang ingin kami ketahui lebih cepat daripada nanti, jadi saya telah memindahkannya ke v0.5.0. Menurut saya, pengaturan PowerShell untuk beralih mode adalah langkah pertama yang terbaik.

@andschwa dan defaultnya adalah ....?

@vors opini _personal_ saya: alias PowerShell diaktifkan; karena Anda menjalankan PowerShell.

Akhirnya kami akan menginginkan panduan "memulai" untuk pertama kali untuk PowerShell, dan akan menyatakan bahwa ini adalah pengaturan yang tersedia.

@BrucePay ada pembaruan tentang ini?

Sinkronisasi kegunaan hari ini menegaskan kembali bahwa alias harus masuk kembali. (Mengalihkan ke sort adalah titik data lain dalam mengalami pengalaman PS yang benar-benar rusak.)

Meninggalkan Bruce sebagai penerima tugas untuk menentukan jalur terbaik ke depan dengan mitigasi di atas. @andschwa : kami mungkin membutuhkan orang lain yang ditugaskan untuk melakukan pekerjaan untuk mengembalikan alias.

Saya baru saja melakukan percakapan dengan @jpsnover dan dia sangat jelas bahwa kami tidak mengembalikan alias. Kita harus membuat kotak masuk aliases.ps1 file dan mempromosikan dot-sourcing itu.

Mungkin perlu ditunjukkan bahwa ls dalam bash biasanya bukan hanya ls , ini adalah alias dengan beberapa argumen default, dengan mungkin yang paling terkenal adalah keluaran menggunakan warna.

Alias ​​PowerShell sama sekali tidak berfungsi seperti alias di Linux, jadi kita perlu mendefinisikan ls sebagai fungsi, atau menyempurnakan alias agar berfungsi lebih seperti alias bash.

Mungkin juga layak meluangkan waktu untuk menganalisis modul di galeri untuk melihat berapa banyak yang tidak berfungsi sebagaimana dengan alias dihapus - sort sangat memprihatinkan.

Alias ​​tersebut tidak ada hari ini, dan kami harus memastikan pada 17 Agustus kami memiliki diskusi yang sehat tentang pro / kontra dari situasi alias yang dapat diikuti orang.

Sepertinya kita punya cerita, menutup masalah.

2p saya tentang ini - Variabel pengaturan PowerShell baru yang mirip dengan $ PSModuleAutoLoadingPreference yang diperkenalkan di PSv3 akan memungkinkan ini untuk dikontrol oleh pengguna akhir di profil mereka (juga dapat mengumpulkan contoh sederhana yang menunjukkan beberapa perintah yang berjalan dengan dan tanpa PS Alias ​​sebagai barang

Nama sugestif $ PSUsePowerShellAliases dan jika tidak secara eksplisit disetel ke true (dalam profil atau secara interaktif) maka alias standar * nix akan digunakan.
Saya percaya bahwa ini kemungkinan juga akan memberikan UX yang lebih baik bagi mereka yang sekarang mungkin memutuskan untuk menguji air dengan PowerShell yang tidak akan pernah dilakukan sebelumnya karena tidak menghilangkan apa yang mereka ketahui tetapi memungkinkan kita yang tahu cara PS kemampuan untuk melakukannya juga.

tidak menghilangkan apa yang mereka ketahui

Benar. Jika harus ada kompromi maka itu harus mendukung pengguna Linux Bash yaitu calon pengguna PowerShell baru. Pengikut PowerShell yang ada dapat membuat ulang alias * nix mereka dengan cukup mudah atau lebih baik lagi, melepaskan diri dari alias tersebut.

Faktanya, sekarang kami memiliki PowerShell di Linux, saya ingin melihat alias bawaan * nix dihapus dari semua versi OS PowerShell Core - jika belum. Itu akan meninggalkan alias built-in yang cocok dengan perintah PowerShell built-in dan tidak berusaha untuk "menipu" Anda.

Saya seorang penggemar untuk menghapus alias umum dari ps di Linux secara default - Saya bukan penggemar "memperbaiki" ini di Windows seperti yang disarankan Keith. Argumen saya untuk ini adalah jika Anda memenangkan pengguna Linux untuk PowerShell dan kemudian mereka memutuskan untuk mencobanya juga di Windows, mereka tidak akan memiliki alias yang sama.

Mungkinkah ini ditambahkan ke PSReadline, kemampuan untuk mengaktifkan Alias ​​Linux atau tidak? Bagi saya, mudah untuk memperbaiki kode saya yang menggunakan nama pendek untuk fungsi. Namun, saya akan selalu mengetik LS terlebih dahulu dan mengharapkannya untuk beroperasi seperti alias PowerShell LS untuk Get-ChildItem .

Silakan gunakan masalah ini untuk menyuarakan pendapat Anda tentang bagaimana seharusnya perilaku PowerShell.

Saya pikir apa yang disentuh @kilasuit , @rkeithhill , dan @ 1RedOne tampaknya merupakan solusi terbaik - menonaktifkannya secara default di Linux dan macOS tetapi pada saat yang sama,

Skrip yang ada dapat diperbarui untuk memeriksa variabel ini dan menonaktifkan atau mengaktifkan opsi saat itu juga, dan itu mengalahkan menuangkan banyak kode untuk mencari nama pendek yang tidak akan berperilaku seperti yang diantisipasi.

Di luar topik - sangat bersemangat karena PowerShell tersedia di platform lain! 😄

mengenai PSReadLine maka @lzybkr harus dapat menyarankan apakah itu kemungkinan sama sekali meskipun saya lebih suka sebagai Variabel PS daripada persyaratan untuk PSReadLine karena ada yang seperti @juneb yang tidak menggunakan PSReadline sama sekali

Saya pasti dapat menerbitkan sampel untuk PSReadline untuk mengganti alias tertentu dengan cmdlet PowerShell, itu akan didasarkan pada contoh ini: https://github.com/lzybkr/PSReadLine/blob/master/PSReadLine/SamplePSReadlineProfile.ps1#L354

Meski begitu, menurut saya ini bukan solusi nyata ..

Masalah terbesar dalam pikiran saya adalah konflik antara portabilitas skrip dan keakraban. Kami telah memberikan panduan bahwa skrip tidak boleh menggunakan alias, tetapi ini masih praktik umum. Beberapa alias mungkin lebih bermasalah daripada yang lain, misalnya sort mungkin digunakan lebih dari ps atau ls dalam skrip.

Kami pasti telah membahas beberapa opsi seperti menyediakan modul yang baru saja Anda impor untuk mendapatkan kembali alias tersebut. Tapi kami belum memutuskan apa pun dan berharap mendapat lebih banyak umpan balik.

Mengganti perintah PowerShell dengan executable asli tanpa dukungan globbing pasti tidak akan membantu meyakinkan bash guys untuk menggunakan PowerShell.

Jadi, teman-teman, mungkin lebih baik menambahkan dukungan globbing ke file executable asli? Itu akan menyelesaikan semua masalah dan membuat PowerShell lebih bermanfaat bagi semua orang, bukan? Tautan # 954.

Sebagai pengguna * nix yang hampir tidak pernah menyentuh jendela, saya ingin memberikan suara yang kuat untuk tidak menggunakan alias. Bertahun-tahun memori otot telah mengajari saya untuk menggunakan ls , rm , dll. Saya tidak ingin harus mempelajari kembali memori otot saya (kemudian mempelajarinya kembali setiap kali saya berakhir di pesta) untuk mendapatkan pengalaman asli Powershell.

Koreksi saya jika saya salah di sini, tetapi apakah ini berbeda untuk dir di windows? Di PS di Windows, dir bukan dir.exe . Itu Get-ChildItem . Di * nix, mengapa ls harus /bin/ls bukan Get-ChildItem ?

@ Gaelan Saya mengerti maksud Anda, tetapi harap pertimbangkan bahwa tidak ada file dir.exe di Windows. dir adalah perintah internal dari cmd prosesor perintah, mirip dengan bash bawaan. Mungkin itulah (satu) alasan karena PowerShell tidak dirancang untuk memanggil perintah eksternal dir.exe secara langsung.

@Gaelan , @ForNeVeR : Meskipun cmd-built-in tidak akan pernah bentrok karena tidak ada sebagai program, ada alias PowerShell yang bertentangan dengan file executable asli, bahkan di Windows.

Secara umum saya tidak berpikir ada _adalah cara yang aman untuk menyimpan alias dan _tidak_ merusak sesuatu karena secara teoritis setiap alias tunggal (kecuali mungkin yang tidak bisa ada di sistem file, seperti ? ) bisa membayangi eksekusi asli yang tidak dapat lagi dipanggil (setidaknya tidak dengan nama dasarnya).

PS> gal|?{gcm "$_.exe" -ea 0}

CommandType     Name
-----------     ----
Alias           fc -> Format-Custom
Alias           sc -> Set-Content
Alias           sort -> Sort-Object
Alias           where -> Where-Object
Alias           write -> Write-Output

Jadi satu-satunya rute _safe_ adalah tidak memiliki alias sama sekali, yang agak mengalahkan tujuannya. Dan tidak diragukan lagi, alias default adalah yang paling nyaman. Sebenarnya saya tidak punya jawaban yang bagus di sini.

Saya pribadi lebih suka alias ditinggalkan. Mereka umumnya ada untuk membuat navigasi dan penggunaan shell umum lebih cepat dan lebih nyaman. Menghapusnya akan menurunkan pengalaman menggunakan PowerShell.

Saya mendukung gagasan kemungkinan menambahkan cara untuk menunjukkan bahwa Anda memanggil biner Linux bawaan sebagai gantinya. Bahkan mungkin sebagai preferensi profil?

Jika Anda melihat riwayat di sini, saya telah menyarankan apa yang menurut saya solusi terbaik dari perspektif UX untuk alias yang memetakan ke perintah non-Windows yang setara

Ini adalah masalah PowerShell yang sudah berlangsung lama. Saya mengeluh bahwa tidak ada perintah yang sebanding dengan cmd dir atau bahkan ls . Jawabannya, setiap saat, adalah "tapi ada alias!".

Alias ​​bukanlah dan tidak pernah menjadi solusi untuk masalah ini. Alias dir dan ls tidak menyediakan fungsionalitas yang disediakan oleh dir dan ls . Hal yang sama juga berlaku untuk alias wget dan curl .

Seluruh pendekatan alias perlu dipikirkan ulang, dan itu berarti melanggar perubahan.

Mengapa alias yang ditentukan sistem tidak bisa hanya menjadi warga kelas dua ke biner di PATH?

Saya akan mengatakan hapus semua alias * nix di Linux, OS X membangun sampai Anda tahu apa yang harus dilakukan.

Edit: Terima kasih telah mengklarifikasi bahwa ini telah dilakukan, maaf atas gangguannya.

@okket yang sudah dilakukan. Kami sedang mendiskusikan jika ada sesuatu yang perlu diubah.

Tampak bagi saya bahwa kita harus meletakkan semua alias dalam file yang orang dapat sumber di profil mereka, dan kemudian, memberikan profil khusus sistem default ...

bash-aliases.ps1
dos-aliases.ps1
initial-aliases.ps1

Jika tidak ada yang lain, itu berfungsi untuk mengingatkan orang bahwa tidak semua orang memiliki nama pendek yang sama.

Jangan lupa (@sleepypikachu) bahwa alias PowerShell tidak melakukan _do_ apa pun kecuali mengganti nama perintah dan mengganti urutan resolusi perintah. Fungsionalitas Bash alias membutuhkan _functions_ di PowerShell.

@ Gaelan memori otot Anda membuat Anda menggunakan alias, tetapi apakah Anda akan frustrasi dengan parameter dan perilaku yang tidak berfungsi sama dengan perintah yang sebenarnya?

Itu adalah masalah sebenarnya di sini dan @DrPizza sangat tepat. Contoh yang bagus adalah, _dir / s_. Perintah itu gagal di PowerShell jadi Anda harus mengubahnya menjadi dir -recurse.

Jadi sebenarnya ada tiga masalah terkait di sini:

  1. Tidak semua parameter memiliki alias
  2. Tidak semua parameter atau perilaku asli dipetakan di PowerShell CmdLet.
  3. Perlu cara untuk menjalankan perintah native jika alias ada

Saya tidak berpikir # 1 terlalu buruk dari suatu masalah dan akan memperburuk keadaan jika mereka alias. Dir -recurse adalah parameter yang lebih mudah dibaca daripada dir / s. Ditambah dengan cross-plat, itu membuat skrip tidak konsisten ketika mencoba berpindah dari Windows ke Linux dan sebaliknya.

2 dan # 3 adalah yang paling penting. Saya tidak pernah menggunakan curl, tapi saya tahu saya mengalami keterbatasan dengan Invoke-WebRequest yang saya harapkan bisa dilakukan oleh curl. (Tidak ingat di atas kepala).

Untuk jangka pendek, saya pikir Anda memerlukan opsi konfigurasi serta cara untuk memanggil perintah asli jika alias diaktifkan.

Default, biarkan diaktifkan. Ini adalah PowerShell .... di Linux. Ini harus berperilaku sebagai PowerShell sehingga mereka dapat mempelajari CmdLets apa yang digunakan. Rekan kerja saya dengan latar belakang Linux dan Perl merasa jauh lebih mudah untuk mengetahui cmds yang dia butuhkan untuk membuat skrip berfungsi. Saya pikir itu adalah grep, ls, dan man yang merupakan kunci baginya. Menggunakan man akan membantu mereka mengetahui cara menggunakan cmd dengan benar.

Untuk jangka panjang, tambahkan cakupan ke cmdlet asli agar memiliki semua parameter dan kemampuan perintah asli. Ini meningkatkan PowerShell untuk Windows dan Linux dengan memberi kami opsi yang lebih kuat. Beberapa perilaku mungkin perlu diubah menjadi beberapa CmdLets dan menggunakan Objects and Pipelines, tapi itu adalah hal yang hebat! Jika tidak, lalu apa gunanya PowerShell?

Pendapat saya adalah tetap apa adanya. Tidak ada alias di PowerShell (kecuali pilih dan lain-lain, mereka diperlukan), alias di Windows PowerShell.

Memberikan opsi lebih baik, tetapi menyediakan semua alias sebagai opsi adalah ... yah, bukan tidak mungkin.

IMHO memiliki alias ls ke dir masuk akal, karena saya dapat dengan mudah menggunakan Where-Object untuk memfilter file. Saya telah menjadi pengguna Linux selama bertahun-tahun dan mengetik dir tidak sealami menggunakan ls.

Bagi saya, konsistensi itu penting. Saya tidak menentang penghapusan alias dari platform lain, tetapi memiliki antarmuka yang berperilaku berbeda tergantung pada OS mengganggu saya. Salah satu poin utama dari menjalankan PS di * nix adalah bahwa ini merupakan satu antarmuka untuk mengatur segalanya. Jika alias akan dihapus dari PowerShell pada platform yang baru didukung, saya pikir beberapa pertimbangan harus dibuat apakah mereka juga harus dihapus di Windows.

Tidak, saya sangat mendukung bahwa PS menyediakan alias secara default, tetapi yang asli di bawah harus memiliki fungsi yang persis sama (dan mungkin kompatibilitas parameter) dengan biner asli asli, kecuali untuk dukungan pengetikan.
PowerShell tanpa tipe tidak berguna.

Menggunakan sistem biner yang mendasari dan mengadopsi filosofi alat unix akan mendorong adopsi. Sebagai orang yang melakukan devops di toko unix, saya sangat terkejut menemukan bahwa binari unix normal agak bekerja dalam implementasi ini. Mengenai masalah karakter *, saya pikir kebanyakan orang di sisi * nix akan merasa nyaman menggunakan karakter escape di depan * saat menunjukkan * nix shell glob sebagai lawan dari perilaku apa pun saat ini di PowerShell. Mungkin akan menjadi solusi yang dapat diterima untuk | karena pipa yang menghasilkan objek alih-alih aliran oktet yang lewat di antara file bertentangan dengan standar yang dipublikasikan dan akan menghalangi adopsi. http://pubs.opengroup.org/onlinepubs/009695399/functions/pipe.html

@ be5invis harap diperhatikan: tidak ada yang akan menghapus tipe dari PowerShell ; baik gci dan Get-ChildItem tetap sama di Windows PowerShell dan Linux PowerShell. Di sini kita hanya berbicara tentang apakah alias bawaan seperti ls -> Get-ChildItem harus ada di Linux atau tidak. Skrip Anda tidak boleh memanggil ls atau gci jika Anda bermaksud memanggil Get-ChildItem (karena menggunakan alias dalam skrip tidak disarankan dan tidak pernah direkomendasikan). ls dan gci hanyalah alias kemudahan untuk penggunaan baris perintah, dan _bisa_ membingungkan pengguna Linux jika ls tiba-tiba menjadi alias Get-ChildItem dan bukan miliknya perintah asli favorit; itu akan semakin membingungkannya jika dia tidak memiliki cara ringkas untuk memanggil perintah ini secara langsung.

Saya untuk menggunakan perintah untuk mengaktifkan alias di PowerShell.
Simpan semua alias dan hentikan secara perlahan di Windows PowerShell.

Saya pikir menggunakan perintah seperti

Enable-Alias Unix
Enable-Alias dos

Untuk mengaktifkan alias memiliki keuntungan sebagai berikut

  1. Ini memecahkan masalah bagi orang yang ingin menggunakan ikal asli
  2. Ini membuat orang enggan menggunakan alias dalam skrip (yang mengganggu keterbacaan skrip.)
  3. Ini juga sangat mudah bagi orang-orang yang menyukai alias itu untuk mengaktifkannya
  4. dan hampir tidak mengganggu kinerja apa pun.

@ForNeVeR Saya menggunakan ls sebagai gci sepanjang hari karena satu huruf lebih pendek ...
Namun memperkenalkan perubahan ini (hapus alias unix-y dan dos-y) jelas merupakan perubahan yang melanggar (tidak seperti curl ). Solusi "sempurna" mungkin menerapkan perintah ini untuk peningkatan yang diketik dari alat yang ada.
Untuk skrip, mungkin ... pernyataan using ?

@ForNeVeR Saya pikir Anda telah salah paham @ be5invis . Dia adalah pendukung kuat PowerShell. Saya pikir apa yang dia maksud dengan "PowerShell tanpa tipe tidak berguna" adalah bahwa orang tidak boleh menggunakan ikal asli di PowerShell.


@ be5invis Juga saya pikir ide Anda tentang kompatibilitas ikal asli jauh jangkauannya. Tata bahasa PowerShell tidak kompatibel dengan tata bahasa unix standar, misalnya Anda dapat melakukan rm -rf di unix tetapi di PowerShell Anda harus melakukan rm -r -fo .
Oleh karena itu, Anda tidak akan pernah mencapai kompatibilitas parameter apa pun yang terjadi.

@chantisnake Jadi mengapa tidak menambahkan parameter yang disebut "rf", yang sama dengan -recurse -force ?

@ be5invis Ini bertentangan dengan cara kerja parameter di PowerShell. Mereka ortogonal, dan jika tidak, ada set parameter yang berbeda. Mereka juga hanya memiliki nama yang panjang dan alih-alih nama pendek mereka dapat disingkat secara individual selama mereka tetap tidak ambigu. Dalam kasus Anda, Anda juga perlu menambahkan alias ke parameter itu, fr . Juga tiba-tiba -Recurse tidak lagi dapat disingkat menjadi -r tetapi harus menjadi -re agar tidak bentrok dengan parameter -rf Anda usulkan.

Anda dapat mengajukan pertanyaan yang sama dari sisi lain: Mengapa tidak menentukan kedua parameter secara terpisah? Anda bersedia untuk melawan prinsip dan konvensi kode PowerShell dengan cara yang cukup besar hanya untuk terus berpura-pura Anda masih bekerja dengan alat Unix yang sama, meskipun sebenarnya tidak. Namun, konvensi parameter GNU dengan nama pendek dan panjangnya hampir tidak universal dan banyak alat yang sudah mapan menentangnya, misalnya tar , atau find . Namun Anda tidak siap untuk melacak bug mereka untuk mengubahnya. Sementara bagian inti dari Unix adalah selalu ada satu miliar program utilitas berbeda yang masing-masing bekerja dengan cara yang sedikit berbeda, tiba-tiba memiliki salah satu dari mereka (memang melakukan sedikit lebih banyak dan mencoba mencakup banyak utilitas lain itu sendiri) adalah begitu membingungkan dan bermasalah sehingga harus diubah? Saya rasa tidak.

Ingat: Cangkang pada mesin Anda adalah milik Anda. Sama seperti orang alias rm hingga rm -i untuk kenyamanan mereka sendiri, tidak ada yang menghalangi Anda untuk menghapus alias rm dan memiliki fungsi pembungkus Remove-Item disebut rm dengan parameter -rf .

Tetapi mencoba mengubah PowerShell secara keseluruhan untuk sepenuhnya mereplikasi setiap alat Unix cukup salah arah.

Fungsionalitas dan keluaran ls telah didefinisikan dengan baik selama bertahun-tahun. Perintah ls mengeluarkan aliran oktet dalam format yang terkenal. Perintah ls tidak menampilkan objek DirectoryInfo dan FileInfo. Memiliki ls output sesuatu yang berbeda minimal membingungkan dan mungkin sedikit menipu.

Saat pengguna siap untuk mendapatkan manfaat dari objek di pipeline, pengguna akan mempelajari tentang Get-ChildItem dan gci. Jika pengguna tidak ingin mendapatkan manfaat dari, atau berurusan dengan, objek dalam pipeline, pengguna mungkin lebih baik menggunakan bash, ksh, csh, sh, dll.

Hal yang sama dapat dikatakan tentang perintah DIR pada Windows.

Biarkan * nix menjadi * nix dan buat Powershell menjadi yang terbaik.

@Tokopedia

Saat pengguna siap untuk mendapatkan manfaat dari objek di pipeline, pengguna akan mempelajari tentang Get-ChildItem dan gci. Jika pengguna tidak ingin mendapatkan manfaat dari, atau berurusan dengan, objek dalam pipeline, pengguna mungkin lebih baik menggunakan bash, ksh, csh, sh, dll.

Ini bertentangan dengan maksud Anda. Jika orang menggunakan Powershell, maka mereka mungkin menginginkan objek di dalam pipa. Kita seharusnya tidak mempelajari kembali perintah dasar untuk memanfaatkan ini.

Setuju dengan @Gaelan.
Jika seseorang tidak menginginkan objek, mereka cukup beralih ke bash atau zsh.
Mereka menginginkan manfaat dari objek, dan aliasing hal-hal seperti ls ke versi yang kompatibel tetapi diketik akan memberi mereka apa yang mereka inginkan.

@ Gaelan dan @ be5invis , saya memahami keinginan untuk membatasi jumlah perubahan yang harus dilakukan pengguna untuk menggunakan Powershell. Jari-jariku sepertinya mengetik ls bahkan sebelum otakku mengirim sinyal kepada mereka.

Masalahnya, perintah dasar yang ada tidak menghasilkan objek. Perubahan sebenarnya yang harus dilakukan bukan dari ls menjadi gci . Perubahan yang lebih besar adalah dari pemikiran yang dilakukan untuk memproses baris teks ke pemikiran tentang properti dan metode apa yang dapat diterapkan pada suatu objek.

Merupakan hak setiap pengguna untuk membuat alias apa pun yang mereka inginkan. Saya setuju bahwa ini dapat dipermudah bagi pengguna untuk melakukan ini dengan menambahkan metode dan properti ke $ Host (System.Management.Automation.Internal.Host.InternalHost) untuk mengaktifkan atau menonaktifkan penggantian perintah asli. Saya telah melihat yang lain, tetapi apakah ada alat konfigurasi profil GUI yang disertakan dengan Powershell?

Jika seseorang tidak menginginkan objek, mereka cukup beralih ke bash atau zsh.

Mengapa PowerShell tidak dapat memberikan "jalan yang mudah" bagi orang-orang yang telah menggunakan bash selama bertahun-tahun dan kemudian memutuskan untuk mencelupkan kaki mereka ke perairan PowerShell? Biarkan mereka mulai dengan apa yang mereka ketahui dan mulai fase dalam fitur PowerShell (seperti perintah pemancar objek dan objek di pipeline) saat mereka semakin nyaman menggunakan PowerShell.

Saya tidak dapat memberi tahu Anda berapa kali saya harus menggunakan baris "_PowerShell adalah shell . Ini akan mengeksekusi utilitas asli favorit Anda dengan baik_" untuk membuat orang melewati gagasan bahwa mereka hanya dapat menggunakan PowerShell dengan perintah yang terdengar lucu dan membuat mereka benar-benar mencoba PowerShell. PowerShell perlu menghormati dan bekerja dengan utilitas asli yang populer sebaik mungkin - titik. Bagaimanapun juga, salah satu pekerjaan utama dari sebuah "shell".

@rkeithhill Jadi izinkan saya menjelaskan: Untuk pengguna yang ingin menggunakan Powershell, mereka menginginkan tipe, bukan? Namun alat asli Anda, seperti /bin/ls , tidak dapat berkomunikasi dengan tipe. Oleh karena itu, beralih ke shell yang diketik, tetapi tanpa utilitas yang diketik, perubahan itu tidak berarti.

Oleh karena itu, pengguna Unix biasa mungkin ingin mengetikkan perintah yang sama, tetapi mendapatkan hasil yang diketik secara langsung. Jadi ada dua pilihan:

  1. Gunakan protokol IPC yang diketik dan beri tahu Linus untuk memperbarui alat mereka - Tidak, mereka tidak akan melakukannya, karena ini ditujukan oleh MUSUH mereka, TUHAN JAHAT , penghancur dunia bebas ! Mereka akan "merangkul dan memadamkan" kita! atau...
  2. Alias ls ke bawaan dengan parameter yang kompatibel.

Untuk pengguna yang ingin menggunakan Powershell, mereka menginginkan tipe, bukan?

Akhirnya, mereka mungkin akan melakukannya. Meskipun demikian, saya bekerja dengan sejumlah pengembang yang saya mulai di PowerShell dengan hanya menjualnya saat menggunakannya dengan Git dan Posh-Git (sesuatu yang tidak dapat disediakan CMD). Mereka jarang menyalurkan apa pun pada saat ini, tetapi saya berharap mereka sampai di sana. Intinya adalah, utilitas git.exe berperilaku di bawah PowerShell seperti halnya di bawah CMD. Transisi yang mudah.

Bagi saya, ls (seperti ps, grep, sed, awk, gcc, curl, dll) hanyalah utilitas asli lain yang seharusnya dapat dijalankan oleh "shell". Sekarang, jika seseorang sudah siap dan menginginkan perintah pemancar objek untuk membuat daftar konten kontainer, mereka dapat menggunakan Get-ChildItem atau aliasnya gci . Jika mereka bertekad bahwa mereka tidak akan pernah menggunakan utilitas asli ls , maka mereka dapat membuat alias ls untuk Get-ChildItem di profil mereka.

BTW Saya tidak berpikir mencoba membuat parameter Get-ChildItem kompatibel dengan ls itu layak. Anda akan segera terputus dengan parameter PowerShell yang tidak peka huruf besar / kecil misalnya -c / -C, -d / -D, -i / -I. Dan PowerShell tidak mendukung penggabungan parameter misalnya ls -rt. Ini jangkauan dan melanggar prinsip Monad PowerShell. Tugas seperti penyortiran akan dilakukan dengan cmdlet terpisah (Sort-Object) dan bukan oleh Get-ChildItem itu sendiri.

@rkeithhill Saya tidak akan membuat Get-ChildItem kompatibel dengan ls . Saya bermaksud cmdlet lain, mungkin disebut UnixCompatibles-ls sebagai nama lengkapnya, dan memiliki parser perintah terpisah yang menerima rasa getopt GNU, bukan PowerShell.

@ be5invis Bukankah opsi yang lebih mudah pada saat itu adalah fungsi terpisah yang menjalankan ls , meneruskan semua argumennya, mem-parsing output dan membuat objek darinya? Parser perintah yang benar-benar terpisah (bersama dengan metadata perintah yang benar-benar terpisah, pemformatan untuk Get-Help , ...) agak berlebihan (selain mereplikasi banyak cara kerja internal PowerShell dengan cara yang tidak kompatibel.

Akan selalu ada dua dunia terpisah di sini, satu asli, satu diketik. PowerShell sudah melayani keduanya, dengan mampu menjalankan program asli dan cmdlet. Saya pribadi tidak melihat manfaat apa pun (hanya upaya besar-besaran dalam upaya pengembangan) dalam mencoba menambahkan lapisan di atas perintah asli yang mereplikasi metadata parameter mereka dalam PowerShell. Selain itu, apa yang akan Anda lakukan tentang tar , atau find (dan banyak program lainnya), yang AFAIK tidak mematuhi konvensi GNU. Implementasikan yet _another_ command parser, bersama dengan fungsi wrapper untuk memanggilnya? Perhatikan juga bahwa agar parser perintah berfungsi, argumen program asli harus diurai dalam PowerShell dan tidak boleh bertentangan dengan bahasa. Sesuatu yang mungkin sulit dilakukan dengan hal-hal aneh seperti [ .

@ygra Tidak apa-apa juga.

Untuk pengguna yang ingin menggunakan Powershell, mereka menginginkan tipe, bukan?

@ be5invis , mungkin di sinilah terjadi sedikit pemutusan hubungan. Tidak, mereka tidak menginginkan tipe. Pengguna ingin menyelesaikan pekerjaan mereka, atau bermain,. Pengguna tahu bahwa ls menghasilkan aliran teks.

Apakah UnixCompatibles kata kerja? Apakah ini akan mengubah skrip $ PROFILE pengguna secara permanen, atau hanya untuk sesi ini? Saya tidak ingin Get-ChildItem kompatibel dengan ls. Biarkan ls menjadi ls dan lakukan apa yang dilakukan ls . Sepertinya ini akan memberi pengguna pilihan untuk mengganti ls dengan Get-ChildItem . Tidak apa-apa. Saya tidak yakin bahwa saya menginginkannya, tetapi bagi mereka yang menginginkannya, tidak masalah.

@Liturgist Menurut saya, yang dimaksud dengan @ be5invis adalah jika orang mengalami kesulitan untuk beralih ke Powershell (sebagai lawan tinggal dengan Bash), itu karena mereka menginginkan sesuatu yang disediakan Powershell. Jika orang menginginkan aliran teks dari ls , (di Linux atau macOS) mereka tidak akan pernah peduli dengan Powershell.

@ Gaelan Jadi saya sebaiknya tidak menggunakan PowerShell jika saya perlu menggunakan gcc atau git? Apa salahnya membiarkan orang memutuskan apakah mereka menginginkan teks (ls) atau objek (gci)? Ada lebih banyak alasan untuk menggunakan PowerShell daripada hanya karena sifat OO-nya - kuat apa adanya. Heck saya lebih suka menggunakan PowerShell hanya untuk C / C # seperti pernyataan aliran kontrol (vs if / fi dan switch case / esac) dan sistem tipe yang tepat (di mana angka adalah angka dan bukan string).

@bayu_joo

Jadi saya sebaiknya tidak menggunakan PowerShell jika saya perlu menggunakan gcc atau git?

Pada sistem * nix, jika pengguna hanya ingin menggunakan shell untuk gcc atau git, mereka tidak akan repot dengan PowerShell, karena shell yang disertakan dengan OS mereka melakukannya dengan sangat baik.

Heck saya lebih suka menggunakan PowerShell hanya untuk C / C # seperti pernyataan aliran kontrol (vs if / fi dan switch case / esac)

Mungkin jika seseorang sudah menggunakan PowerShell, mereka lebih suka karena itu, tapi saya ragu seseorang akan menginstal PS hanya untuk itu.

sistem tipe yang tepat (di mana angka adalah angka dan bukan string)

/bin/ls juga tidak berfungsi dengan sistem tipe: jika saya menjalankan ls -l , saya akan mendapatkan ukuran file sebagai string alih-alih nomor PS yang sesuai.

Saya merasa alasan pengguna baru akan beralih ke PS di * nix sebagian besar berkisar pada OO dan sistem tipe. Kami harus membuatnya semudah mungkin bagi pengguna baru untuk memulai dengan PS – jika saya melihat sesuatu tentang PS, mencoba memeriksanya, hanya untuk mengetahui bahwa saya perlu mempelajari kembali segala sesuatu tentang baris perintah untuk menggunakannya, saya mungkin akan jauh lebih kecil kemungkinannya untuk repot mempelajarinya daripada jika saya dapat menjalankan PS, ketik ls dan segera lihat sistem tipe beraksi. Ya, saya dapat menggunakan alias, tetapi jika saya hanya mencoba PS dalam beberapa menit, saya tidak mungkin ingin melakukan banyak konfigurasi sebelum saya masuk dan mulai bermain-main.

Pada sistem * nix, jika pengguna hanya ingin menggunakan shell untuk gcc atau git, mereka tidak akan repot dengan PowerShell, karena shell yang disertakan dengan OS mereka melakukannya dengan sangat baik.

Mungkin jika seseorang sudah menggunakan PowerShell, mereka lebih suka karena itu, tapi saya ragu seseorang akan menginstal PS hanya untuk itu.

Maaf, tapi saya sangat tidak setuju. Sebagai pengguna Linux, saya ingin menggunakan PowerShell sebagai pengganti shell yang disertakan dengan OS saya. Untuk semuanya. Karena itu luar biasa lho :)

Heck, saya bahkan mengemas PowerShell untuk NixOS sekarang hanya untuk menggunakannya untuk semuanya.

Harap pertimbangkan bahwa pengguna target kami bukan hanya pengguna Unix asli yang tidak sengaja menggunakan Windows + PowerShell, tetapi juga pengguna Windows yang tidak sengaja menggunakan Unix + PowerShell;)

Karakter tunggal (seperti ^) yang secara otomatis termasuk dalam PATH asli

Saya juga lebih suka menjaga alias tetap kompatibel di seluruh OS setiap kali mereka valid pada platform ini dan menggunakan karakter melarikan diri (seperti ^ls ) untuk mendapatkan akses implisit ke perintah asli, seperti yang disarankan oleh @joeyaiello
Saya tidak akrab dengan filosofi PowersShell secara keseluruhan, tetapi apa yang salah dengan pendekatan seperti itu?

Sebenarnya, satu hal lagi untuk menggunakan pelolosan karakter tunggal: bash sudah melakukannya. https://twitter.com/climagic/status/806536501232340992

\ls mengabaikan semua alias.

Apakah jawaban untuk alias diselesaikan dengan mengaktifkan WSL (Subsistem Windows untuk Linux)? Ini akan memberikan perintah sed asli, awk, ls, dll. Di shell bash.

Walaupun masih beta code untuk Windows 10, pastinya akan hadir dan tersedia di Server 2016 dan 2012.

@Liturgist Saat ini, WSL adalah lingkungan yang sangat terpisah dari PowerShell. Perintah tidak dapat dipanggil dari sesi PowerShell. Selain itu, ini mungkin akan dianggap sebagai regresi oleh banyak pengguna Windows PowerShell saat ini karena banyak skrip akan rusak jika mereka menerima keluaran dari, katakanlah, GNU ls daripada ls -> Get-ChildItem . Meskipun penggunaan alias tidak pernah direkomendasikan dalam skrip, faktanya tetap bahwa mereka telah digunakan dan kerusakan akan menyebabkan kesulitan bagi banyak orang.

@Liturgist : @bgshacklett ada di sini. Masalahnya bukanlah sesuatu terjadi saat Anda mengetik ls , pertanyaannya adalah parameter apa yang Anda harapkan saat menggunakannya, dan apakah keluaran yang dipancarkan dapat dikonsumsi dalam mode berorientasi objek oleh cmdlet PowerShell lainnya (yaitu ls | Where-Object Name -like *foo* tidak akan berfungsi jika Anda menggunakan WSL ls ).

Masalah asli dengan alias yang bertentangan dengan cmds asli telah diatasi. Jika ada kebutuhan untuk memiliki kemampuan untuk menambahkan kembali alias Windows PowerShell yang populer, itu seharusnya menjadi masalah tersendiri.

Membuka https://github.com/PowerShell/PowerShell/issues/3610 untuk merekam masalah sekunder

Apakah halaman ini membantu?
0 / 5 - 0 peringkat