• Online Tools
  • - Calculators
    • Character Count
  • - Download
    • TikTok Download
    • DouYin Download
  • - Web Tools
    • BASE64
    • Base64 to Image
    • Image to Base64
    • URL Encoding
    • JavaScript
    • Timestamp
    • Unicode Converter
    • JSON Format
    • Modify Extension
    • Make List
    • CSS Optimizer
  • - Encryption Tools
    • MD5 Encryption
    • Random Generator
  • - Image Tools
    • Image Compression
    • QR Code Generator
    • QR Code Reader
    • Wallpaper Preview
  • - Info Sheets
    • Blood Type Heredity
    • Clothing Sizes
  • [email protected]
DopuBox
  • English
  • Español
  • Français
  • 日本語
  • 한국어
  • 简体中文
  • 繁體中文
全部 ニュース Meta Code 文化・アート
Linux環境でVI/VIMでファイルを編集するときに保存する権限のない解決方法(一般ユーザー)
2022-02-19

Linux環境では、VI/VIMコマンドを直接使用して変更権限のないファイルを編集する場合、保存するときに保存操作ができないことをユーザーに提示します。一般的な解決策は、ファイルを閉じて再びsudo権限で開いて編集してから保存することです(ユーザーがsudo権限を持っている場合)。実は、VI/VIMモードでは簡単なコマンドで、現在のファイルを閉じずにファイルを保存する目的を達成できます。

方法1

について!sudo tee%>/dev/nullこのコマンドの説明は次のとおりです。

このコマンドは、現在のファイル(%)をstdinとしてsudo teeコマンドに渡して実行します。

方法2

 

Linuxで働いている友人は、Vimでファイルを編集したとき、実行:wq保存が終了し、突然エラーが発生しました。

E45: 'readonly' option is set (add ! to override)

これはファイルが読み取り専用であることを示しており、ヒントに従って、追加します!強制保存::w!,次のようなエラーが発生しました。

"readonly-file-name" E212: Can't open file for writing

ファイルが存在するのに、なぜプロンプトが開かないのですか?この間違いは何を表しているのだろうか。ドキュメントの表示:help E 212:

For some reason the file you are writing to cannot be created or overwritten.

The reason could be that you do not have permission to write in the directory

or the file name is not valid.

権限がない可能性があるからだ。このファイルを編集するにはroot権限が必要ですが、現在ログインしているのは普通のユーザーだけで、編集する前にsudoを使ってVimを起動するのを忘れたので、保存に失敗しました。そこで、修正が失われないように、別の一時ファイルtemp-file-nameとして保存してからVimを終了し、sudo mv temp-file-name readonly-file-nameを実行して元のファイルを上書きするしかありません。

しかし、このような操作は煩雑すぎる。また、このファイルを一時保存したいだけで、変更を続ける必要がある場合は、履歴の編集、bufferステータスなど、Vimの作業状態を維持したい場合は、どうすればいいですか?Vimを終了しないでroot権限を取得してこのファイルを保存できますか?

ソリューション

	*:w_c* *:write_c*
:[range]w[rite] [++opt] !{cmd}
			Execute {cmd} with [range] lines as standard input
			(note the space in front of the '!').  {cmd} is
			executed like with ":!{cmd}", any '!' is replaced with
			the previous command |:!|.

The default [range] for the ":w" command is the whole buffer (1,$)

答えはいいです。このようなコマンドを実行すればいいです。

:       w               !sudo tee %
|       |               |  |
:[range]w[rite] [++opt] !{cmd}
:w !sudo tee % 次に、このコマンドがなぜ機能するのかを分析します。まず、ドキュメントを表示します:help:w、下にスクロールすると、次のように表示されます。 この使用方法を前のコマンドに対応して、以下のようにします。 range range Vimで外部コマンドを実行 sudo tee %

:!{cmd}

:!ls

:r !pwdまたは:r!ls

このとき、すべてのコンテンツがVimに読み込まれ、Vimを終了せずにコマンドを実行し、コピーしてVimに貼り付けられます。これにより、Vimは終了することなくshellを自由に操作できます。

コマンドの別の表示形式

前のドキュメントを参照してください。

Execute {cmd} with [range] lines as standard input

したがって、実際には、wは現在のファイルを本当に保存していません。実行:w new-file-nameのように、現在のファイルの内容を別のnew-file-nameのファイルに保存します。ここでは、保存ではなく、別の名前で保存します。現在のドキュメントの内容を後述するcmdの標準入力に書き込んでからcmdを実行するので、コマンド全体を同じ機能を持つ通常のshellコマンドに変換できます。 $ cat readonly-file-name | sudo tee %

これで「正常」に見えます。その中でsudoはよく理解して、rootに切り替えて後のコマンドを実行することを意味して、teeと%は何ですか?

%の意味 :help cmdline-special

In Ex commands, at places where a file name can be used, the following

characters have a special meaning. These can also be used in the expression

function expand() |expand()|.

% Is replaced with the current file name. *:_%* *c_%*

cmd sudo tee readonly-file-name

$ cat readonly-file-name | sudo tee readonly-file-name

注意:別の場所でもよく%を使います。間違いありません。置き換えます。しかし、そこでは%の役割が異なります。実行:help:%ドキュメントを表示します。 Line numbers may be specified with: *:range* *E14* *{address}* {number} an absolute line number ... % equal to 1,$ (the entire file) *:%*

置換では、%はファイル名ではなくファイル全体を表すことを意味します。したがって、コマンド:%s/old/new/gでは、ファイル名のoldをnewに置き換えるのではなく、ドキュメント全体のoldをnewに置き換えることを示します。

teeの役割

man page

ls -l

readonly-file-name

tee

/dev/null

コマンド実行後

上記のコマンドを実行すると、次のプロンプトが表示されます。

W12: Warning: File "readonly-file-name" has changed and the buffer was changed in Vim as well

See ":help W12" for more info.

[O]K, (L)oad File:

Vimはファイルの更新を求め、ファイルを確認するか再ロードするかを尋ねます。履歴の編集、bufferなどのVimの作業状態を維持し、元に戻すなどの操作を継続できるため、Oを直接入力することをお勧めします。Lを選択すると、ファイルが新しいファイルで開き、すべての作業状態が失われ、元に戻すことができず、bufferの内容も空になります。

より単純なシナリオ:マッピング

上記の方法は、文章の最初に提起する問題を非常に完璧に解決したが、結局、コマンドはまだ少し長いので、長い列のコマンドを入力するたびに、簡単なコマンドにマッピングすることができる.vimrc:

" Allow saving of files as sudo when I forgot to start vim using sudo.

cmap w!! w !sudo tee > /dev/null %

これで、簡単な運転:w!!できます。コマンド後半>/dev/nullは、標準出力の内容を明示的に破棄するために機能する前に説明した。 もう一つの考え方 これで、完璧だがtrickyの案が完成した。なぜ次のようなより一般的なコマンドを使わないのかと聞かれるかもしれません。これはもっと理解しやすくて、もっと簡単ではありませんか? :w !sudo cat > %

リダイレクトの問題

前のように同じ機能のshellコマンドに変換できることを分析します。

$ cat readonly-file-name | sudo cat > %

このコマンドは少しも問題がないように見えますが、実行すると別のエラーが発生します。

/bin/sh: readonly-file-name: Permission denied

shell returned 1

これはどういうことですか。sudoをつけたのに、どうして権限がないとヒントを与えたの?リダイレクトはshellが実行するため、すべてのコマンドが開始される前にshellがリダイレクト操作を実行するため、sudoの影響を受けず、現在のshell自体も一般ユーザーとして起動し、このファイルを書く権限もないため、上記のエラーが発生しました。

リダイレクトスキーム

tee

sudo

shell

:w !sudo sh -c 'cat > %'

しかし、このように実行すると、一重引用符が存在するため、Vimでは%は展開されず、そのままshellに渡されるが、shellでは1つの%がnilに相当するため、ファイルはnilにリダイレクトされ、すべての内容が失われ、ファイルの保存に失敗する。

%が展開されていないためにエラーが発生した場合は、一重引用符'を二重引用符"に変更してもう一度試してみます。


ソース元URL:https://dopubox.com/article/p/6c7f5f90d510c24b

Other Tools
  • Character Count TikTok Download DouYin Download BASE64 Base64 to Image Image to Base64 URL Encoding JavaScript Timestamp Unicode Converter JSON Format Modify Extension Make List CSS Optimizer MD5 Encryption Random Generator Image Compression QR Code Generator QR Code Reader Wallpaper Preview Blood Type Heredity Clothing Sizes
  • 住所要件の指摘受け自主的に転入 東京・足立区の20代選管委員・古野香織さん
    2024-05-30

    作曲家ビゼーの窮地を救った傑作オペラ『真珠採り』の聴きどころは?【クラシック今日は何の日?】
    2024-05-31

    現代詩の「中原中也賞」、俳句で培われた言語感覚…「新たな音やリズム」ジャンルを往来し追求
    2024-06-02

    あらゆる知識に精通した「天才」が教えてくれた、頭を良くするための新書の読み方と「究極のインプット・アウトプット」の方法
    2024-06-02

    吉田南さん、バイオリン部門6位 エリザベート音楽コン、奈良出身
    2024-06-01

    富士山麓のダイナミックな食材を味わう“奥・山梨”のガストロノミー〈Restaurant SAI 燊〉。
    2024-06-01

    中国でドラえもん映画が興行首位 国際こどもの日に12億円
    2024-06-03

    ニコライ・バーグマンが手がける北欧のジュエリーブランド〈フローラダニカ〉旗艦店が南青山にオープン。
    2024-06-03

    フジコ・ヘミングさん偲ぶ魂のピアノ旋律
    2024-06-03

    写真家たちは強大な権力の抑圧にどう抗ったのか。バルト三国の写真家に焦点を当てる展覧会をレポート
    2024-06-04

    現代美術作家の杉本博司がYouTubeチャンネル開設 素顔に迫る映像を公開
    2024-06-04

    お台場エリアを舞台に新芸術祭「東京お台場トリエンナーレ 2025」が誕生
    2024-06-05

    東京都写真美術館で「今森光彦 にっぽんの里山」が開催へ
    2024-06-04

    石川九楊の個展「石川九楊大全」が上野の森美術館で2ヶ月連続開催へ
    2024-06-05

    特別展「梅津庸一 クリスタルパレス」が国立国際美術館で開催。00年代からの仕事を総覧
    2024-06-04

    横山奈美の個展「広い空に / Big Sky Mind」がN&A Art SITEで開催へ
    2024-06-05

    美しくて“かわいい”結びの技  1400年の歴史を誇る「水引」の可能性を探って
    2024-06-06

    安藤忠雄さん設計の美術館名称決まる…香川・直島に2025年オープン
    2024-06-05

    宗教2世のドラマが受賞 第50回放送文化基金賞
    2024-06-06

    今週末に見たい展覧会ベスト8。閉幕の横浜トリエンナーレから、「梅津庸一 クリスタルパレス」、石川九楊の2ヶ月連続個展まで
    2024-06-06

    ©  Dopu Box
    💛