web-dev-qa-db-ja.com

ターミナルの永続的なコマンドショートカットをcdに設定してダウンロードします

/binという名前のramという名前の新しいテキストファイルを作成しました。

watch -n 1 free -h

ファイルsen

watch -n 1 sensors

入力を避けるために、同じフォルダに

watch blahblahblah...

毎回。

また、これら2つの権限を

-rw-r--r--

-rw-r--r-x

そして私の目標を達成しました。シェルを再度開いた後でも動作しました。つまり、watch -n 1 free -hの代わりにramと入力できました

しかし、同じ手順を試した後に問題が発生しました

cd /home/myname/Downloads/

/binに保存され、dowという名前の新しいテキストファイル。権限も同じです。

今回はdowはメッセージを表示しなくても、ターミナルでは何もしません。

同じファイルを/usr/binに保存しようとしましたが、端末は何もせず、作業ディレクトリは変更されません。

これはどのように可能ですか?

5
mk1024

スクリプトを作成しましたが、動作します。スクリプトは、それを呼び出すシェルとは別のシェルで実行されるため、目的の処理を実行しません。

スクリプトが実行されるシェルは、スクリプトが指示したとおりに動作します。作業ディレクトリを~/Downloadsに変更します。他に何もすることがないので、終了します。呼び出し元のシェルのディレクトリは変更されていません。

あなたは私の言葉を受け取る必要はありません-lsファイルの次の行にdowを追加することでそれを実証できます。コマンドを実行すると、~/Downloadsディレクトリの内容が一覧表示されます(通常の色は、~/.bashrcのエイリアスによって提供され、非対話型シェルでは提供されません)読まない)。

現在のシェルでスクリプトを実行するには、sourceコマンドを使用できます。このコマンドは、. fileとも記述できます。だから、あなたが入力した場合

. dow

現在のシェルはディレクトリを変更します。

または、代わりにエイリアスを設定できます:

zanna@toaster:~$ alias dow='cd $HOME/Downloads'
zanna@toaster:~$ dow
zanna@toaster:~/Downloads$ 

永続的にするには、次の行を追加します

alias dow='cd $HOME/Downloads'

~/.bashrcファイルに。これにより、インタラクティブシェルを実行するたびに使用できるようになります。

7
Zanna

これはクロスサイトの複製です: https://stackoverflow.com/a/255415/383694

問題は、スクリプトがサブシェルで実行されることです。スクリプトはディレクトリを変更してから閉じ、現在のシェルに変更を加えません。

2つの緩和策:

  1. . dowを実行して、現在のシェルのコンテキストでスクリプトを実行します。
  2. たとえば、ディレクトリの変更を行う〜/ .bashrcファイルでエイリアスを使用します-alias dow="cd /home/myname/Downloads/"など。

ディレクトリを変更する場合は、通常、他のことを行う前に動作することをテストすることをお勧めします。

リンクされた質問には他のいくつかのオプションがあります。

3
pbhj